Oracle 判断字符串是否能转成数字。
而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/
總結
以上是生活随笔為你收集整理的Oracle 判断字符串是否能转成数字。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于set sql_trace=ture
- 下一篇: 转: ubuntu apt-get 与