新一天有新的问题,每解决一个问题,就会获得新的知识。最近有一个需求,需要在Oracle查询结果中去除表数据中含有的特殊符号,如回车符、换行符等,因为当这些数据导出形成报文时,特殊符号可能导致诸如读取错误这样的问题。
刚开始走了点弯路,过于相信AI的搜索与推理,结果一直出来的是空值,AI还一个劲给我解释,拼命让我相信我原来的字段就是空。不过后来终于知道怎么处理了,就记录下来。
Oracle的替换函数可以用replace,不过它是针对字符串进行的整体替换,而我消除的特殊符号有多个,一个一个处理再麻烦,而translate则可以按字符进行一一对应的替换。如
select translate('abcdefac','ac','xy') from dual;
得到的结果是'xbydefxy',就是将源字段中所有的a->x,b->y,按字符逐一替换,即使它们不相邻。如果要替换成的字符数少于被替换字符,比如
select translate('abcdefac','acd','xy') from dual;
a->x,c->y,d没有对应的替换对象,就按空值替换,等于删除d。
如果是用replace函数,replace('abcdefa','ac','xy'),则只会得到'abcdefxy','ac'是当成一个整体处理,替换的是整个ac字符串,就是只有相邻的ac才被换成xy,前面不相邻的'abc'中的ac不会被替换。
现在来操作特殊符号,在Oracle中回车符是CHR(13)、换行符是CHR(10),其它特殊符号这里就不列了,就以上面两个符号为例,
select translate(string,'@'||chr(10)||chr(13),'@') from dual;
其中,string是要处理的字段值,然后就是替换的字符,@->@、chr(10)->''、chr(13)->'',就是把所有的回车和换行符都替换成空(''),就是删除这两种特殊符号。至于前面为什么要加一个@的替换(实际没有变,还是@),如果只写下面这样:
select translate(string,chr(10)||chr(13),'') from dual;
最早开始我就是这么写的,结果只能得到一个空值NULL,不能实现消除特殊符号的目的,全被删除了,因此要在最前面加一个非空的替换字符,不一定只能是@,可以是要处理字段中的字符,只要替换成自身就不影响,或者是处理字段以外的字符,反正不会搜索到,换成什么也不影响原值。
以上就是Oracle中translate函数的用法,不过最后我并没有用上这个方法在Oracle中过滤提取数据或限制输入数据,而是在应用程序层面进行检测与限制。
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/2345.html