Oracle 判断字符串是否能转成数字。
而Oracle沒有這個函數(shù),所以在sql語句使用to_number函數(shù)時有時候會因?yàn)閿?shù)據(jù)問題導(dǎo)致系統(tǒng)出錯。
解決方案有幾個,
一, 新建1個自定義函數(shù), 利用to_number,? 能轉(zhuǎn)換成to_number的就返回真, 轉(zhuǎn)換出錯的就返回假。
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;
二,這種方法不用新增自定義系統(tǒng)函數(shù),利用translate函數(shù),只需要加在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))
因?yàn)楦吡磷志涞脑?#xff0c;v.value中存在不能轉(zhuǎn)成數(shù)字的字符數(shù)據(jù),所以是會報錯的。
而加入下面這些判斷后,
?select t.instance
?? from sys.v$thread? t,
??? ??? ?? sys.v$parameter? v
?? where v.name = 'thread'
?? and translate(v.value,'a1234567890.-','a') is null --必須由數(shù)字和"."和"-"組成
?? and translate(v.value,'1.-','1') is not null --去掉"."和"-"后至少1個字符,也就是至少有1個數(shù)字啦
?? and length(v.value) - length(replace(v.value,'.','')) < 2 --"."的個數(shù)必須少于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))
就不會報錯了,因?yàn)樵趫?zhí)行to_number之前已經(jīng)把不符合要求的數(shù)據(jù)篩掉。
執(zhí)行了上面的條件后, 其實(shí)還有類似“-.6",".1" 這樣的數(shù)據(jù)保留,其實(shí)無所謂,因?yàn)閠o_number是可以無錯執(zhí)行的。
關(guān)于translate函數(shù)可以參考:http://nvd11.blog.163.com/blog/static/2000183122012112605432545/
總結(jié)
以上是生活随笔為你收集整理的Oracle 判断字符串是否能转成数字。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于set sql_trace=ture
- 下一篇: 解决gnome3 不能设置无线网络属性