首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果Var是一定的值,则省略

如果Var是一定的值,则省略
EN

Stack Overflow用户
提问于 2014-11-02 12:20:15
回答 3查看 69关注 0票数 0

如果变量是某个值,是否可以省略WHERE?下面这句话不管用,我正在努力寻找答案;

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-02 12:54:28

这是有条件地包含子句的常见场景。

看看这个:

代码语言:javascript
复制
WHERE 
     (@rMonth = 0  OR MONTH(insDate) = @rMonth)
AND  (@rYear = 0 OR YEAR(insDate) = @rYear)
AND  (@sID = 0 OR sID = @sID)

在上面的查询中,对于每个子句,只有当左侧为false时,才会应用"OR“的右侧。否则,整条子句被认为是真,不过滤任何行。

希望通过使用上面的技巧,任何复杂的子句都可以写在"OR“的右边,而不是简单的等式比较。

票数 3
EN

Stack Overflow用户

发布于 2014-11-02 12:23:14

代码语言:javascript
复制
WHERE
  (@rMonth <= 0)
  OR
  (month(insDate) = @rMonth AND year(insDate) = @rYear)
票数 3
EN

Stack Overflow用户

发布于 2014-11-02 13:53:15

实现同样结果的另两种选择:

一次--按照最初的要求使用CASE语句:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26699225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档