神奇ORA-01722無效的數字
开发反馈,在查询一个表的时候,查询的栏位里面明明没有非数字的字符串,但是在使用TO_NUMBER时,会报错ORA-01722: 無效的數字
开发sql:
SELECT SCR_SPEED
FROM monkey.monkey_test
WHERE ADD_DATE >=
TO_DATE ('2022/08/01 07:00:00', 'yyyy/MM/dd hh24:mi:ss') and to_number(SCR_SPEED) > 0;
报错,无效的数字
排查1:
SELECT TO_NUMBER(SCR_SPEED)
FROM monkey.monkey_test
WHERE ADD_DATE >=
TO_DATE ('2022/08/01 07:00:00', 'yyyy/MM/dd hh24:mi:ss');
不报错,这时候就很奇怪了,明明可以TO_NUMBER,但为啥开发会报错呢
排查2:
WITH tt
AS (SELECT TO_NUMBER (SCR_SPEED) SCR_SPEED
FROM MONKEY.monkey_test
WHERE ADD_DATE >=
TO_DATE ('2022/08/01 07:00:00', 'yyyy/MM/dd hh24:mi:ss'))
SELECT *
FROM tt
WHERE tt.SCR_SPEED > 0;
还是报错,我把可以跑的部分抽出来,再跑还是不行
排查3:
CREATE TABLE monkey.test
AS
SELECT TO_NUMBER (SCR_SPEED) SCR_SPEED
FROM MONKEY.monkey_test
WHERE ADD_DATE >=
TO_DATE ('2022/08/01 07:00:00', 'yyyy/MM/dd hh24:mi:ss');
select * from monkey.test where scr_speed >0;
不再报错,说明在这个时间范围里面确实没有非数字的字符串
经过对比,发现to_number只有在where条件里面的时候会报错,此时,猜测作为where条件的时候,需要去整个表里面筛选记录,虽然在时间段内没有非数字的字符串,但是整个表里面有,用如下sql验证
SELECT * FROM monkey.monkey_test where length(REGEXP_REPLACE(SCR_SPEED,'[^0-9]','wocao'))>3
发现确实有一笔时开发测试的记录,SCR_SPEED的值为test,通知开发删除后,执行正常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现