2014-04-03 68 views
0

我知道我可以通過輕鬆地將兩個完整的語句放在一個CASE語句本身中來實現這一點,但是我對SQL很陌生,並且試圖學習以最高效和智能的方式編寫這個複製任何邏輯,所以我想也許有一種方法,我可以打開或關閉基本條件線。WHERE子句中的Oracle PL SQL CASE

我有以下語句(不BTW工作,缺少一個關鍵字,它說):

 OPEN O_CURSOR FOR 
     SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME 
     FROM RFS.RF_STORE S 
     WHERE S.TYPE_CODE != 'W' 
     AND 
      CASE I_CAN_BE_CLOSED 
       WHEN 0 THEN 
       S.CLOSE_DATE IS NULL 
      END     
    ORDER BY S.STORE_NO_4_DIGIT; 

有基於輸入變量I_CAN_BE_CLOSED兩種情況下,值0或1。

在一種情況下,我想允許它只返回NULL CLOSE_DATES的商店,而在另一種情況下,我希望它返回(關閉和非關閉商店)。

回答

1

CASE表達式中的Oracle SQL不能返回布爾值。這應該是等價的,前提是I_CAN_BE_CLOSED永遠不能爲null:

OPEN O_CURSOR FOR 
    SELECT S.STORE_NO_4_DIGIT AS STORE_NO, S.STORE_NAME 
    FROM RFS.RF_STORE S 
    WHERE S.TYPE_CODE != 'W' 
    AND (I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL) 
ORDER BY S.STORE_NO_4_DIGIT; 

編輯:

其實這裏給出兩個答案都是正確的...驗證最簡單方法是在每一種情況下寫下來真假表:

I_CAN_BE_CLOSED S.CLOSE_DATE [1]      [2] 
0     NULL   FALSE OR TRUE = TRUE (TRUE AND TRUE) OR FALSE = TRUE 
0     NOT NULL  FALSE OR FALSE = FALSE (TRUE AND FALSE) OR FALSE = FALSE 
1     NULL   TRUE OR TRUE = TRUE  (FALSE AND TRUE) OR TRUE = TRUE 
1     NULL   TRUE OR FALSE = TRUE (FALSE AND FALSE) OR TRUE = TRUE 

[1] == "I_CAN_BE_CLOSED != 0 OR S.CLOSE_DATE IS NULL" 
[2] == "((i_can_be_closed = 0 and s.close_date IS NULL) or (i_can_be_closed = 1))" 
+0

對不起。賈斯汀毆打你...不知道這是否會工作,除非我不明白甲骨文將如何執行此操作。如果第一個陳述是真的,它不會繼續到第二個? – SomeRandomDeveloper

+0

好吧,我又回到了這裏,我試了一下,我意識到這是更優雅的解決方案。起初我並不確定,因爲我不知道如果SQL發現第一個是真的,SQL將如何處理這兩個語句。但事實並非如此,所以你不需要Justin的答案中的'或'。 – SomeRandomDeveloper

+0

已更新答案,以包含正確性證明。 –

1

這聽起來像你只是想OR在一起的夫婦的謂詞

AND ((i_can_be_closed = 0 and s.close_date IS NULL) or 
    (i_can_be_closed = 1)) 
+0

謝謝,這個工作! – SomeRandomDeveloper