我使用了这个查询
SELECT nvl(round(sum(PAP.QTY_PLAN_ANPLN) / 1000), 0) PRODUCTION
FROM PPC_ANNUAL_PLANS PAP
WHERE PAP.MAAST_ASSET_ID IN( '35390','35392')
用此代码替换where
子句
PAP.MAAST_ASSET_ID in (CASE
WHEN 'DRI' = 'RMP'
THEN '2242'
WHEN 'DRI' = 'DRI'
THEN '35390,35392'
WHEN 'DRI' = 'SMP'
THEN '2241'
END)
Oracle抛出此错误
ORA-01722:无效号码
这个问题的解决方案是什么?
答案 0 :(得分:1)
在where
条件中使用OR,如下所示:
where
dri = 'DRI' AND MAAST_ASSET_ID in (200,300)
OR
dri = 'SMP' AND MAAST_ASSET_ID in (222,333)
OR
dri = 'RMP' AND MAAST_ASSET_ID in (555,777,888)
如果你坚持使用CASE表达式,那么肯定可以这样做:
where
1 = case
when dri = 'DRI' AND MAAST_ASSET_ID in (200,300) THEN 1
when dri = 'SMP' AND MAAST_ASSET_ID in (222,333) THEN 1
when dri = 'RMP' AND MAAST_ASSET_ID in (555,777,888) THEN 1
END
但第二个条件可能会导致大型表的数据库性能下降==> Oracle能够优化第一个查询,但不能在第二个条件下执行,在这种情况下,它总是会在表上使用全表扫描。