如果Var是确定的值,则省略WHERE

时间:2014-11-02 12:20:16

标签: sql sql-server if-statement case

如果变量是某个值,是否可以省略WHERE?以下不起作用,我很难找到答案;

DECLARE @rMonth int, @rYear int, @sID int
SET @rMonth  = 0;
SET @rYear = 0;
SET @sID= 0;

SELECT 
    TCS.bStatus AS jStatus, TCS.ID, TCS.sID, TCS.insDate, TCS.statusLabel, TCS.cID
FROM 
    TCS
    CASE WHEN @rMonth > 0 THEN 
        WHERE month(insDate) = @rMonth AND year(insDate)  = @rYear 
END

3 个答案:

答案 0 :(得分:3)

WHERE
  (@rMonth <= 0)
  OR
  (month(insDate) = @rMonth AND year(insDate) = @rYear)

答案 1 :(得分:3)

这是有条件地包含条款的常见方案

检查一下:

WHERE 
     (@rMonth = 0  OR MONTH(insDate) = @rMonth)
AND  (@rYear = 0 OR YEAR(insDate) = @rYear)
AND  (@sID = 0 OR sID = @sID)

在上面的查询和每个子句中,只有当左侧为假时才应用“OR”的右侧。否则整个条款被认为是真实的,不会过滤任何行 希望通过使用上述技巧,任何复杂的子句都可以写在“OR”的右侧,而不是简单的相等比较。

答案 2 :(得分:0)

实现相同结果的另外两个选项:

一个 - 使用最初想要的CASE语句:

WHERE MONTH(insDate) = CASE WHEN @rMonth > 0 THEN @rMonth ELSE MONTH(insDate) END
AND YEAR(insDate) = CASE WHEN @rYear > 0 THEN @rYear ELSE YEAR(insDate) END
AND sID = CASE WHEN @sID > 0 THEN @sID ELSE sID END

和另一个 - 使用ISNULLNULLIF函数:

WHERE MONTH(insDate) = ISNULL(NULLIF(@rMonth, 0), MONTH(insDate))
AND YEAR(insDate) = ISNULL(NULLIF(@rYear, 0), YEAR(insDate))
AND sID = ISNULL(NULLIF(@sID, 0), sID)