对Sql使用CASE WHEN语句

时间:2014-11-08 07:54:52

标签: oracle oracle10g

我使用了这个查询

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:无效号码

这个问题的解决方案是什么?

1 个答案:

答案 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能够优化第一个查询,但不能在第二个条件下执行,在这种情况下,它总是会在表上使用全表扫描。