代码之家  ›  专栏  ›  技术社区  ›  Ratha

如何在sql的where条件中定义if子句?

sql
  •  0
  • Ratha  · 技术社区  · 5 年前

    我在SQL的where条件中尝试一个简单的if语句。我不想 CASE 因为它很简单。

    例子:

    CREATE PROCEDURE [dbo].[usp_GetStatus]
        @siteId INT,
    
    
        ........
        FROM sites
        WHERE StartDate = @reportMonth
          AND..
          AND ...
          AND IF(@siteId > 0) sites.SiteId = @siteId 
        ........
    

    我想把简单的定义如上。

    我的 siteId 如果用户传递整数值,则参数可以是0或大于0。我想省略我的和条件,如果 站点ID 参数为0。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Ben    5 年前

    通常在SQL中使用布尔逻辑处理这个问题。所以你可以写:

    WHERE  StartDate = @reportMonth
    AND..
    AND ...
    AND (@siteId <=0 OR  sites.SiteId = @siteId)
    

    所以如果 @siteId 不大于0它忽略 OR 子句,但如果是,则它将评估 sites.SiteId 条款。通常对于存储过程,我会将默认值设置为空并检查是否为空:

    CREATE PROCEDURE [dbo].[usp_GetStatus]
    
    @siteId INT = NULL,
    ........
    from sites;
     WHERE  StartDate = @reportMonth
    AND..
    AND ...
    AND (@siteId IS NULL OR  sites.SiteId = @siteId)
    
        2
  •  1
  •   Ketan Kotak    5 年前

    我宁愿建议

    CREATE PROCEDURE [dbo].[usp_GetStatus]
        @siteId INT,
    
    
        ........
        FROM sites
        WHERE StartDate = @reportMonth
          AND..
          AND ...
          AND 
    sites.SiteId = case when @siteId > 0 then @siteId else sites.SiteId end