今天在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.