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/

转载于:https://www.cnblogs.com/nvd11/archive/2013/04/02/2996834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值