oracle 连表查询时的数据类型问题

今天同事在执行以下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)


或者 最好的方法 修改字段类型 -. -




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值