今天在oracle數據庫中看到replace和translate的嵌套就有點蒙了,於是就上網看了一下,感覺豁然開朗:
今天遇到的問題如下:
replace(TRANSLATE(a.deal_msg,'0123456789',' '),' ','') AS deal_msg ,
這只是一條sql語句中的部分片段,什麼意思呢?就是將a.deal_msg字段中出現的0和1替換為空格,當然也包括將01替換為兩個空格,並將a.deal_msg中出現的23456789無論是連續還是單個數字均刪除,然後再將替換後的字符串中的連續兩個空格替換為一個空格,為什麼會這樣呢?先看看translate和replace的規則吧!
一、translate:
TRANSLATE(CHAR,FROM,TO),將char中出現的from替換為to中相應的字符,如果from的長度大於to的長度,那麼將from大於to的長度之後的出現在char中的字符刪除。舉個簡單的例子:
select translate('anhw','ang','A') from dual;
查詢結果:
---------
Ahw
結果分析:因為第三個參數的A和第二個參數的a位置對應,所以將第一個參數的a替換為A,又因為第二個參數的長度為3,第三個參數的長度為1,小於第二個參數2個長度,所以將出現在第一個參數中的n和g和ng刪除,由於anhw中有n,故將n刪除,因此結果為
Ahw.
二、replace
REPLACE(char, search_string,replacement_string),將char中出現的字符串search_string全部替換為replacement_string字符串。如果第二個參數在第一個參數中沒有那麼返回結果還是第一個參數的原字符串,舉個簡單的例子:
select replace('anhw','ang','A') from dual;
查詢結果:
-----------
anhw
結果分析:由於ang在anhw沒有對應的連續字符,因此不會進行替換,返回原字符串.
select replace('anhw','an','A') from dual;
查詢結果:
-----------
Ahw
結果分析:由於an在anhw字符串中有對應的連續字符,因此將其替換為A,返回結果為Ahw.