ORACLE translate函数
1. 语法
2.用途
(1) translate的返回值,是将expr(源字符串)参数中,所有对应在from_string(源字符串中想要被替换的字符)参数中所出现的字符,均按from_string参数中在to_string(想要源字符串中被替换的对应目标字符)参数中对应的字符替换掉后的值。expre源字符串中有但from_string参数中没有的字符,当然就不被替换;
栗子:
SELECT TRANSLATE('123x21','3','1') FROM DUAL;
可见3被换成了1。这时与replace函数作用类似。
但translate与replace不同之处在于,他能够单独替换一个字符,而replace是字符整体替换:
SELECT TRANSLATE('123x2y1','xy','ab') FROM DUAL;
可见x,y字符被分别对应替换成了a,b,而replace的话使用'xy'整体字符替换是起不到作用的,因为源字符串中并没有整体字符串'xy'.
(2) from_string参数中可以比to_string参数中包含更多的字符。因此,当出现这种情况时,在from_string参数后面部分字符,在to_string参数里找不到对应的字符。而此时如果源字符串expr参数中又含有在from_string参数中多余(即按一一对应原则,在to_string中找不到对应位置的字符)字符,那么最终返回值中源字符串expr中的这些字符将会被剔除:
SELECT TRANSLATE('123x2y1','xy','a') FROM DUAL;
可见,x对应a,而y并无对应字符,因此源字符串中x被替换成a,而y字符返回时直接被剔除。
(3) 如果在from_string参数中有多个相同字符,那么它将被to_string参数中与其对应的第一个字符所替换:
SELECT TRANSLATE('123xxxx2y1','xxx','abc') FROM DUAL;
可见,from_string参数中出现三个相同的x,to_string中虽然也定义也与其对应的a,b,c三个字符,但最终源字符中所有的x字符还是被匹配的第一个字符a所替换。
(4) to_string参数使用空字符串(注意并不是指空格,也不是指这个参数直接缺失,而是指这个参数不包含任何字符,只有两个单引号),并不能在返回值中移除掉全部在from_string参数中的字符.Oracle数据库将空字符识别为null值,而translate函数在以null值为to_string参数值时,最终只会返回null:
SELECT TRANSLATE('123xxxx2y1','xxx','') FROM DUAL;
而如果to_string参数为空格的话,则会正常按空格替换。
(5) 上述to_string参数定义为空字符串无法去除掉源字符串中所有from_string中的字符,因此,想要达到这种目的,迂回作战,可以在from_string参数前面连接一个在expr源字符串中并没有的字符,然后to_string参数同样的,随便定义一个expr中并没有的字符,一般就直接使用from_string参数前的连接字符了:
select translate('A1234567','!123' ,'&') from dual;
可以看到,源字符串中想要去除的1,2,3三个字符,均被去除掉。这个写法实际上就是按from_string与to_string字符一一对应的原则,!与&字符对应替换,但源字符串中并没有,所以猫的任何作用,而后面1,2,3三个字符,在to_string中并没有对应的可替换字符,因此,按前述原则,translate在返回时直接在源字符串中剔除。
最后,看一个官方的例子:
SELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL;
此处需要注意的是,源字符串expr参数与from_string参数中,均含有一个单引号字符,另一个单引号用来转义。即源字符串实际为:SQL*Plus User's Guide ,而from_string参数实际为 ' */'' ,即空格,星号,斜杠,单引号,to_string参数为三个半角下划线,因此,实际from_string参数中前三个字符分别对应一个下划线,而最后的单引号,没有对应可替换字符,直接剔除。如此便可得目标结果 。如果单引号不使用转义,直接用ascii代替换,也可得到相同结果 :
参考文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/About-SQL-Functions.html#GUID-D51AB228-518C-4213-8BD4-F919623D105E