2017-10-20 79 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

是的!它確實和我收到的數據提出了一些問題,我需要問某人(因爲房間即將拉出似乎不正確!)謝謝你,謝謝你 –