日期:2014-05-16  浏览次数:20501 次

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版本新加入的功能)



[SQL] view plaincopy
01.--通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57') 
02.DECLARE 
03.    str             VARCHAR2(10) := '123a'; 
04.    val             NUMERIC(10); 
05.    i               int; 
06.    k               int; 
07.    flag            BOOLEAN; 
08.BEGIN 
09.    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&nbs