例如现在有表table1:(注:第七行记录VALUE值是两个空格)
ID VALUE
1 123
2 17SF
3 7788
4 DOTA
5 SK123
6 333333
7
现在定位VALUE中不全是数字组成的记录:
select * from table1 where length(rtrim(translate(VALUE,' 0123456789','# '))) > 0
结果:
ID VALUE
2 17SF
4 DOTA
5 SK123
7
首先讲一下translate函数吧:
TRANSLATE ( 'char' , 'from_string' , 'to_string' )
TRANSLATE返回将from_string中的每个字符替换为to_string中的相应字符以后的string。TRANSLATE是REPLACE所提供的功能的一个超集。如果from_string比to_string长,那么在from_string中而不在to_string中的额外字符将从char中被删除,因为它们没有相应的替换字符。to_string不能为空。Oracle将空字符串解释为NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL。
举个例子:
select translate('123abc','2dc','4e') from dual;
因为from_string和to_string的位置是一一对应的,2对应4,d对应e,c没有对应的值,所以c应该会被删除。所以例子的字符里的2会替换为4,d因为字符串里没有,所以不作替换,c由于没有对应的替换字符,所以字符串里的c会被删除。那么可以得出,结果是:143ab
所以我将0~9的数字全部用空格来替换,然后同过rtrim函数将空格过滤,再计算长度,如果都是数字的话,计算的长度就是0。但是如果一条记录里的值存在空格的情况就要将空格用其他字符进行替换以免被rtrim函数一起过滤掉。