本文介紹了判斷字符串是否全為數字的4種辦法,另外還介紹了一個translate函數的小技巧,從任意字符串中提取數字(調用2次translate函數)。這個辦法是一個公司同事發現的,用起來很方便,但理解起來稍有點困難。
1、通過ASCII碼判斷是否數字,介於[48, 57]之間,(ascii('0') = 48, ascii('9') = '57')
2、調用cast函數嘗試強制轉換成NUMERIC或NUMBER,不是合法數字串即拋異常
3、調用translate函數,剔除所有[0-9]數字后,看是否為空串
4、調用正則表達式,進行模式匹配(10g版本新加入的功能)
1 --通過ASCII碼判斷是否數字,介於[48, 57]之間,(ascii('0') = 48, ascii('9') = '57') 2 DECLARE 3 str VARCHAR2(10) := '123a'; 4 val NUMERIC(10); 5 i int; 6 k int; 7 flag BOOLEAN; 8 BEGIN 9 flag := TRUE; 10 for i in 1..10 loop --新密碼是否6位數字 11 k := ascii(substr(str, i, 1)); 12 if k < 48 or k > 57 THEN 13 flag := FALSE; 14 end if; 15 end LOOP; 16 17 IF flag = true THEN 18 dbms_output.put_line(str || '是[0-9]的數字序列'); 19 ELSE 20 dbms_output.put_line(str || '不是[0-9]的數字序列'); 21 END IF; 22 END; 23 24 -- 調用cast函數嘗試強制轉換成NUMERIC或NUMBER,不是合法數字串即拋異常 25 DECLARE 26 str VARCHAR2(10) := '123'; 27 val NUMERIC(10); 28 BEGIN 29 val := CAST(str AS NUMERIC); 30 dbms_output.put_line(str || '是[0-9]的數字序列'); 31 EXCEPTION 32 WHEN value_error THEN -- 字符串轉實數錯誤 33 --dbms_output.put_line(SQLCODE || ', ' || SQLERRM); 34 dbms_output.put_line(str || '不是[0-9]的數字序列'); 35 END; 36 37 --調用translate函數,剔除所有[0-9]數字后,看是否為空串 38 DECLARE 39 str VARCHAR2(10) := '123abc'; 40 BEGIN 41 IF replace(translate(str, '0123456789', '0'), '0', '') IS NULL THEN 42 dbms_output.put_line(str || '是[0-9]的數字序列'); 43 ELSE 44 dbms_output.put_line(str || '不是[0-9]的數字序列'); 45 END IF; 46 END; 47 48 --調用正則表達式,進行模式匹配(10g版本新加入的功能) 49 SELECT * 50 FROM dual 51 WHERE regexp_like('1234', '^[[:digit:]]+$'); 52 53 --從任意字符串中提取數字串(調用2次translate函數)。 54 --假定初始串為str。首先將str中數字全部替換為空格,輸出記為str2; 55 --其次,對每個在str中出現的任意str2串中字符,如果是str2的首字符則替換為空格,其它字符則全部剔除 56 DECLARE 57 --str VARCHAR2(100) := ' 護照01浙江2 3昆 山4蘇 3'; 58 str VARCHAR2(100) := ' 護照浙江 昆 山蘇 4'; 59 ret VARCHAR2(10); 60 BEGIN 61 ret := TRIM(TRANSLATE(str, trim(TRANSLATE(str, '1234567890', ' ')), ' ')); 62 dbms_output.put_line(ret); 63 END;