ora-01722:invalid number

今天在把一个字段转换成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; 就没报错了。

在此记录一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值