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