如果变量是某个值,是否可以省略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发布于 2014-11-02 12:54:28
这是有条件地包含子句的常见场景。
看看这个:
WHERE
(@rMonth = 0 OR MONTH(insDate) = @rMonth)
AND (@rYear = 0 OR YEAR(insDate) = @rYear)
AND (@sID = 0 OR sID = @sID)在上面的查询中,对于每个子句,只有当左侧为false时,才会应用"OR“的右侧。否则,整条子句被认为是真,不过滤任何行。
希望通过使用上面的技巧,任何复杂的子句都可以写在"OR“的右边,而不是简单的等式比较。
发布于 2014-11-02 12:23:14
WHERE
(@rMonth <= 0)
OR
(month(insDate) = @rMonth AND year(insDate) = @rYear)发布于 2014-11-02 13:53:15
实现同样结果的另两种选择:
一次--按照最初的要求使用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)https://stackoverflow.com/questions/26699225
复制相似问题