2017-10-20 55 views
0

你好我正在尝试基于我们的一个数据块的标准进行选择。他们可以选择所有选择,并且无法使其工作或运行得更好。在等于或等于值的地方改进Oracle Where子句

我怎么会有现在这一点,但它似乎真的笨重,有时我觉得它不拿起一些值

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) 
+0

其中(子查询)常能较好地表达。介意分享完整的SQL脚本? – Twelfth

+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-' 
+0

本质上这是一种形式,人们选择他们的东西想。如果它应该选择所有与之相关的代码,即A100,B100等。否则,应该只选择他们选择的代码,这将是SLRRDEF_RDEF_CODE =:parm_dd_rdef.RDEF_CODE –

+0

@Taku_不艾伦的最后一点满足你的需求? – Twelfth

+0

是的!它确实和我收到的数据提出了一些问题,我需要问某人(因为房间即将拉出似乎不正确!)谢谢你,谢谢你 –