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.youkuaiyun.com/luocm/article/details/2648559

转载于:https://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值