今天在把一个字段转换成number时用了to_number(字段)函数,可一直报ora-01722:invalid number 这个错误,于是想把导致这个错误的字段找出来,首先用了排除法,把那些能转换的排除掉:
1.select to_number(col_name) from table_name WHERE regexp_like(l11,'(^[0-9]+$|^[0-9]+[.][0-9]+$)');
上面用了正则表达式,^表示字符的开始,$表示字符的结尾,[0-9]表示由数字0到9组成,+表示匹配前面的子表达式一次或多次,|表示或的意思,[.]表示字符点“."。
通过上面的表达式,首先排除了数字开头数字结束或数字开头中间带点数字结束的字符串,这些字符都能通过to_number函数的转换并不报错,那么,报错的记录就在剩下的记录里面。
select to_number(' ') from dual;--报错
select to_number('2 ') from dual;--不报错
select to_number(' 2 ') from dual;--不报错
select to_number(null) from dual;--不报错
select to_number(' 23.') from dual;--不报错
select to_number(' .2 ') from dual;--不报错
通过上面的实验,单独转换空格报错,但数字前后带空格转换不报错,null 不报错;数字前后带点都不报错。
后来我又通过replace 函数过虑了一些其他特殊字符:
select to_number(replace(col_name,chr(10),'')) from table_name;
10 LF (NL line feed, new line) 换行键
13 CR (carriage return) 回车键
32 space 空格
到最后,原来那个导致问题的是tab键,这个字符的ASCII是9,于是
select to_number(replace(col_name,chr(9),'')) from table_name; 就没报错了。
在此记录一下!