今天同事在执行以下sql时报错:ORA-01722: invalid numberORA-01722: invalid number
select a0.*
from BK_FUNCTION a0
join BK_USER_POWER o0 on o0.APPID = a0.ID
where o0.DATAID = '81'
and o0.TYPES = '2'
and a0.VALID = '1';
尝试直接执行
select a0.*
from BK_FUNCTION a0
join BK_USER_POWER o0 on o0.APPID = a0.ID
没有报错
逐条去除查询条件 发现 o0表的字段都去掉后 报错消失
尝试修改 where o0.DATAID = '81'
and o0.TYPES = '2'
为
where o0.DATAID = '81'
and o0.TYPES = '1'
后报错消失
最终发现导致问题的原因是联合查询的On的字段类型不一致 a0.ID是number类型的
修改字段类型后问题消失
弯路主要是在执行不同的查询条件时 有时报错 有时不报
最后结论是 在执行联合查询时 字段类型不一致时 oracle聪明的会隐式转换
这就是 select a0.*
from BK_FUNCTION a0
join BK_USER_POWER o0 on o0.APPID = a0.ID 为什么成功的原因
但当查询条件有结果时 oracle的智商就不足以处理这种情况了 不会去做隐式转换
要么在查询时 加 to_number on o0.APPID = to_number(a0.ID)
或者 最好的方法 修改字段类型 -. -