2016-12-02 62 views
2

下面是SQL Server查詢的一部分,它不按預期工作。我不知道爲什麼,但條件落在這部分,就像沒有插入任何東西(就像所有三個條件都設置爲NULL)。我在這裏做錯了什麼?SQL Server條件不起作用

輸入參數的存儲過程:

@cStockPacked varchar(1) = NULL, 
    @cWrittenDown varchar(1) = NULL, 
    @cInPreparation varchar(1) = NULL 

這是不工作的查詢部分:

( 
    (@cStockPacked IS NULL OR 
    (@cStockPacked = '1' AND MEST.MEST_STA = '1') 
    ) 
    OR 
    (@cInPreparation IS NULL OR 
    (@cInPreparation = '1' AND MEST.MEST_STA = '2') 
    ) 
    OR 
    (@cWrittenDown IS NULL OR 
    (@cWrittenDown = '1' AND MEST.MEST_STA = '4') 
    ) 
) 

我試圖進行硬編碼的條件下,一切都按預期:

(
    MEST.MEST_STA = '1' OR MEST.MEST_STA = '2' OR MEST.MEST_STA = '4' 
) 

我試過一個條件(硬編碼),然後用兩個,後來所有三個。一切都很好。我想通過粘貼上面的查詢來獲得相同的結果,但有些顯然是錯誤的。我究竟做錯了什麼?

整個過程:

ALTER PROCEDURE [dbo].[sp_CAMERC_HLP] 
    ( , @cStockPacked varchar(1) = NULL 
     , @cWrittenDown varchar(1) = NULL 
     , @cInPreparation varchar(1) = NULL 
    ) 
AS 
BEGIN 
    SELECT 
     MEST.MEST_QUA, MERC_STA, MERC_NME, 
     MERC_DES, MERC_NTO, MERC_UNI, MERC_LPR, 
     MERC.UNIT_KEY, 
     COUNT_ALL_ROWS = COUNT(*) OVER() 
    FROM 
     CAMERC MERC 
    INNER JOIN 
     CAMEGR CAMEGR ON MERC.MEGR_KEY = CAMEGR.MEGR_KEY 
    INNER JOIN 
     CAMEST MEST ON MERC.MERC_KEY = MEST.MERC_KEY 
    WHERE         
     (@cMERC_NME IS NULL OR MERC_NME LIKE '%' + @cMERC_NME + '%') 
     AND 
     (@iMEGR_KEY IS NULL OR MERC.MEGR_KEY IN (SELECT MEGR_KEY FROM CTE))   
     AND 
     (@cMERC_CDO1 IS NULL OR MERC_CDO1 LIKE '%' + @cMERC_CDO1 + '%') 
     AND  
     and 
     ( 
      (@cStockPacked IS NULL OR @cStockPacked = '1' AND MEST.MEST_STA = '1') 
      OR 
      (@cInPreparation IS NULL OR (@cInPreparation = '1' AND MEST.MEST_STA = '2')) 
      OR 
      (@cWrittenDown IS NULL OR (@cWrittenDown = '1' AND MEST.MEST_STA = '4'))     
     ) 
END 
+0

認爲你將不得不展示更多的查詢,人們將需要上下文來理解問題可能是什麼。例如@cStockPacked是如何定義的 – Flexicoder

+0

我不太瞭解這個問題。 「不起作用」的代碼正在實施與「確實有效」的代碼不同的邏輯。我不驚訝不同的邏輯會產生不同的結果。 –

+0

爲什麼不同的邏輯?我只是硬編碼了我想從條件出來的東西。 – FrenkyB

回答

3

你可能在找這個

(
    ( 
    (@cStockPacked IS NOT NULL AND @cStockPacked = '1' AND MEST.MEST_STA = '1') OR 
    (@cInPreparation IS NOT NULL AND @cInPreparation = '1' AND MEST.MEST_STA = '2') OR 
    (@cWrittenDown IS NOT NULL AND @cWrittenDown = '1' AND MEST.MEST_STA = '4')  
) 
    OR 
    (@cStockPacked IS NULL OR @cInPreparation IS NULL OR @cWrittenDown IS NULL) 
) 
+0

就是這樣:)非常感謝。 – FrenkyB

+0

有一個問題 - 如果我沒有設置任何這些條件,什麼都不會顯示。我沒有得到任何結果。 – FrenkyB

+0

更新了Ans。確保你必須使用確切的括號,如Ans –

0

我不明白,爲什麼你接受的答案是正確的,它並沒有多大意義,以測試爲無功NULL與那些條件。

您只需要 - 使這些條件與其他條件相同。就像這樣:

AND (@cMERC_NME IS NULL OR MERC_NME LIKE '%' + @cMERC_NME + '%') 

它們更新爲:

AND (@cStockPacked IS NULL OR (@cStockPacked = '1' AND MEST.MEST_STA = '1')) 
    AND (@cInPreparation IS NULL OR (@cInPreparation = '1' AND MEST.MEST_STA = '2')) 
    AND (@cWrittenDown IS NULL OR (@cWrittenDown = '1' AND MEST.MEST_STA = '4'))  

就是這樣。