使用等于或在值中改进Oracle Where子句

时间:2017-10-20 19:55:23

标签: sql oracle

您好我正在根据我们的某个数据块的条件尝试选择。他们可以选择-All-选择,但我无法让它工作或运行得更好。

我现在如何拥有它,但它看起来真的很笨重,我认为有时它并没有拿起一些价值

where SLRRDEF_RDEF_CODE = (select CASE
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'A100'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'A110'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B100'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B110'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B120'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'B130'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'W110'
                    WHEN :parm_dd_rdef.RDEF_DESC like '-All-' Then 'W590'
                    ELSE :parm_dd_rdef.RDEF_CODE
                    END from dual

我想尝试一些有效的东西,但是我得到了错误的括号/关键字错误,我不相信它与它有任何关系。有人能帮忙吗

where (CASE
      WHEN :parm_dd_rdef.RDEF_DESC like '-All-' THEN SLRRDEF_RDEF_CODE in ('A100','A110','B100','B110','B120','B130','W110','W590')
      WHEN :parm_dd_rdef.RDEF_DESC not like '-All-' THEN SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE
      END)
      AND

where SLRRDEF_RDEF_CODE in (CASE WHEN :parm_dd_rdef.RDEF_DESC like '-All-' 
THEN ('A100','A110','B100','B110','B120','B130','W110','W590')
ELSE :parm_dd_rdef.RDEF_CODE)

1 个答案:

答案 0 :(得分:3)

case的目的是允许您在通常不允许的地方使用布尔逻辑。由于where子句首先基于布尔逻辑,因此使用case语句通常会出现失误。

很难确切地说出你想要完成什么,但是插入一点,我认为这可能是你的场景更好的解决方案:

WHERE SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE
      OR (:parm_dd_rdef.RDEF_DESC = '-All-' 
          and SLRRDEF_RDEF_CODE 
              in ('A100','A110','B100','B110','B120','B130','W110','W590'))

如果您在参数为SLRRDEF_RDEF_CODE时真的不关心'-All-'的价值,那么它就更容易了:

where SLRRDEF_RDEF_CODE = :parm_dd_rdef.RDEF_CODE
       OR :parm_dd_rdef.RDEF_DESC = '-All-'