replace和translate函數(shù)詳解
簡(jiǎn)要比較:
replace:字符串級(jí)別的代替
如:SELECT REPLACE('acdd','cd','ef') FROM dual; →aefd
translate:字符級(jí)別的代替
如:SELECT TRANSLATE('acdd','cd','ef') FROM dual; →aeff
分別詳解:
replace:
語法:REPLACE ( char , search_string [, replacement_string] )
解釋:repalce中,每個(gè)search_string都被replacement_string所代替。
select replace('acdd','cd','ef') from dual;→ aefd
如果replacement_string為空或?yàn)镹ULL,那么所有的search_string都被移除。
select replace('acdd','cd','') from dual;→ad
如果search_string為null,那么就返回原來的char。
select replace('acdd','','ef') from dual;→acdd
select replace('acdd','','') from dual;→acdd(也是兩者都為空的情況)
translate:
語法:TRANSLATE ( 'char' , 'from_string' , 'to_string' )
解釋:Translate中,每個(gè)from_string中的字符被to_string中相應(yīng)的字符所代替。
select translate('acdd','cd','ef') from dual;→aeff
如果from_string比to_string長,那么from_string中多余的字符將被移除。
select translate('acdd','acd','ef') from dual;→ef (a由e代替,c由f代替,d就被移除)
select translate('acdd','cda','ef') from dual;→eff(c由e代替,d由f代替,a就被移除)
如果to_string為空,或者兩者都為空,那么返回char也為空。所以to_string不能為空。
select translate('acdd','cd','') from dual;→ (空)
select translate('acdd','','') from dual;→(空)
實(shí)戰(zhàn):
如何判斷一個(gè)字符串是否是數(shù)字?
解:先轉(zhuǎn)換:由于to_string不能為空,我們巧用#號(hào)代替
select translate('abc123','#1234567890.','#') from dual;→abc
from_string中的#被to_string中的#代替,但char中又沒有#字符,所以通過這一步躲開了to_string必須不為空的規(guī)則。然后后面的數(shù)字以及小數(shù)點(diǎn)都轉(zhuǎn)換為空,于是原來的字符串中只留下abc三個(gè)字符。
轉(zhuǎn)換好后,用nvl2判斷即可:
select nvl2(translate('abc123','#1234567890.','#'),'字符串','數(shù)字') from dual;→字符串
nvl2的作用就是,NVL2 (expr1, expr2, expr3) ->expr1不為NULL,返回expr2;為NULL,返回expr3。這樣我們就可以判斷一個(gè)字符串是否是數(shù)字了!解畢!