2016-12-02 162 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'))  

就是这样。