Oracle 判断字符串是否能转成数字。

Sybase 有自带的系统函数 isnumeric 来判断1个字符是否能转换成数字。

而Oracle没有这个函数,所以在sql语句使用to_number函数时有时候会因为数据问题导致系统出错。

解决方案有几个,

一, 新建1个自定义函数, 利用to_number,  能转换成to_number的就返回真, 转换出错的就返回假。
CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
   RETURN NUMBER
IS
   v_str FLOAT;
BEGIN
   IF str IS NULL
   THEN
      RETURN 0;
   ELSE
      BEGIN
         SELECT TO_NUMBER (str)
           INTO v_str
           FROM DUAL;
      EXCEPTION
         WHEN INVALID_NUMBER
         THEN
            RETURN 0;
      END;

      RETURN 1;
   END IF;
END isnumeric;



二,这种方法不用新增自定义系统函数,利用translate函数,只需要加在where条件里。
例如下面这个sql语句
  select t.instance
   from sys.v$thread  t,
           sys.v$parameter  v
   where v.name = 'thread'
   and (v.value = '0' or
             t.thread# = to_number(v.value))

因为高亮字句的原因,v.value中存在不能转成数字的字符数据,所以是会报错的。



而加入下面这些判断后,

 select t.instance
   from sys.v$thread  t,
           sys.v$parameter  v
   where v.name = 'thread'
   and translate(v.value,'a1234567890.-','a') is null --必须由数字和"."和"-"组成
   and translate(v.value,'1.-','1') is not null --去掉"."和"-"后至少1个字符,也就是至少有1个数字啦
   and length(v.value) - length(replace(v.value,'.','')) < 2 --"."的个数必须少于2
   and (instr(v.value,'-',0)= 0 or (                         --没有"-"
                                     --或者只有1个"-"字符,而且用"-"开头
                                    (length(v.value) - length(replace(v.value,'-','')) = 1)
                                     and  substr(v.value,1,1) ='-'))

   and (v.value = '0' or
             t.thread# = to_number(v.value))


就不会报错了,因为在执行to_number之前已经把不符合要求的数据筛掉。
执行了上面的条件后, 其实还有类似“-.6",".1" 这样的数据保留,其实无所谓,因为to_number是可以无错执行的。
关于translate函数可以参考:http://nvd11.blog.163.com/blog/static/2000183122012112605432545/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值