如果变量是某个值,是否可以省略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
答案 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
和另一个 - 使用ISNULL
和NULLIF
函数:
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)