注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

饥民2011

一直在搬砖

 
 
 

日志

 
 
 
 

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

2012-12-26 18:13:43|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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/
  评论这张
 
阅读(773)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017