Oracle中如何判斷字符串是否全為數字


本文介紹了判斷字符串是否全為數字的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;

本文轉載於:http://blog.csdn.net/luocm/article/details/2648559


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM