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 || &apos;是[0-9]的数字序列&apos;);   
  19.     ELSE  
  20.         dbms_output.put_line(str || &apos;不是[0-9]的数字序列&apos;);   
  21.     END IF;   
  22. END;   
  23.   
  24. -- 调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常   
  25. DECLARE  
  26.     str    VARCHAR2(10) := &apos;123&apos;;   
  27.     val    NUMERIC(10);   
  28. BEGIN  
  29.     val := CAST(str AS NUMERIC);   
  30.     dbms_output.put_line(str || &apos;是[0-9]的数字序列&apos;);   
  31. EXCEPTION   
  32.    WHEN value_error THEN -- 字符串转实数错误   
  33.        --dbms_output.put_line(SQLCODE || &apos;, &apos; || SQLERRM);   
  34.        dbms_output.put_line(str || &apos;不是[0-9]的数字序列&apos;);   
  35. END;   
  36.   
  37. --调用translate函数,剔除所有[0-9]数字后,看是否为空串   
  38. DECLARE  
  39.     str VARCHAR2(10) := &apos;123abc&apos;;   
  40. BEGIN  
  41.     IF replace(translate(str, &apos;0123456789&apos;, &apos;0&apos;), &apos;0&apos;, &apos;&apos;) IS NULL THEN  
  42.         dbms_output.put_line(str || &apos;是[0-9]的数字序列&apos;);   
  43.     ELSE  
  44.         dbms_output.put_line(str || &apos;不是[0-9]的数字序列&apos;);   
  45.     END IF;   
  46. END;   
  47.   
  48. --调用正则表达式,进行模式匹配(10g版本新加入的功能)   
  49. SELECT *   
  50. FROM dual   
  51. WHERE regexp_like(&apos;1234&apos;, &apos;^[[:digit:]]+$&apos;);   
  52.   
  53. --从任意字符串中提取数字串(调用2次translate函数)。   
  54. --假定初始串为str。首先将str中数字全部替换为空格,输出记为str2;   
  55. --其次,对每个在str中出现的任意str2串中字符,如果是str2的首字符则替换为空格,其它字符则全部剔除   
  56. DECLARE  
  57.     --str    VARCHAR2(100) := &apos; 护照01浙江2     3昆 山4苏 3&apos;;   
  58.     str    VARCHAR2(100) := &apos; 护照浙江     昆 山苏 4&apos;;   
  59.     ret    VARCHAR2(10);   
  60. BEGIN  
  61.     ret := TRIM(TRANSLATE(str, trim(TRANSLATE(str, &apos;1234567890&apos;, &apos;          &apos;)), &apos; &apos;));   
  62.     dbms_output.put_line(ret);   
  63. END;  

select trim(translate(t.szjcpc,translate(t.szjcpc,1234567890,' ')||' ',' ')),t.szjcpc
   from t_hp_sj_jcgzxzdcb_temp t

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值