【问题标题】:SQL - Conditional WHERE clauseSQL - 条件 WHERE 子句
【发布时间】:2010-02-26 04:33:20
【问题描述】:

我有一个执行查询的 SQL Server 2005 存储过程。这个存储过程接受三个参数。参数如下:

@StateID 为整数,
@CountyID 为整数,
@CityID 作为整数

这些参数用于查询客户列表。如果参数值不为空,我基本上想做一个“AND”。但是,我目前无法执行 if-else。如果参数值不为空,如何添加这些子句。换句话说:

SELECT
  *
FROM
  Customer c
WHERE
 c.StateID=@StateID 
 -- AND c.CountyID=@CountyID IF @CountyID IS NOT NULL
 -- AND c.CityID=@CityID IF @CityID IS NOT NULL

【问题讨论】:

    标签: sql sql-server-2005 tsql


    【解决方案1】:

    将它们与一些 OR 语句结合起来:

    SELECT *
    FROM
        Customer c
    WHERE
        c.StateID=@StateID
        AND ( c.CountyID=@CountyID OR @CountyID IS NULL )
        AND ( c.CityID=@CityID OR @CityID IS NULL )
    

    对于这些参数中的每一个,如果它为空,则基本上忽略检查。

    【讨论】:

    • 由于可搜索性,这将表现不佳。请参阅 gbn 的答案以了解要考虑的替代方案。
    • OMG Ponies - 这是因为 Aaron 在 OR 之后 进行了 NULL 检查吗?
    • Aaron 回答,与 gbn 不同,即使列 CountyID 本身可能包含 NULL 值,它也具有工作的优势。我需要类似这个问题中的功能,但我的列有一些 NULL 值;这个对我有用。
    【解决方案2】:
    SELECT * 
    FROM Customer c 
    WHERE c.StateID=@StateID 
    AND c.CountyID= ISNULL(@CountyID, c.CountyID) 
    AND c.CityID = ISNULL(@CityID, c.CityID)
    

    【讨论】:

      【解决方案3】:
       c.StateID=@StateID 
       AND
       c.CountyID = ISNULL(@CountyID, c.CountyID)
       ...
      

      使用 IF 语句

      或者

       c.StateID=@StateID 
       AND
       @CountyID IS NULL OR c.CountyID = @CountyID)
       ....
      

      或者动态SQL

      或者在 SO 中搜索所有其他提出相同问题的问题...

      【讨论】:

        【解决方案4】:
         SELECT * FROM Customer c WHERE (c.StateID=@StateID) AND ((c.CountyID=@CountyID) OR (@CountyID IS NULL)) AND ((c.CityID=@CityID) OR (@CityID IS NULL))
        

        【讨论】:

          【解决方案5】:

          没有“正确的方法”,它取决于很多因素,这里有一篇很棒的文章描述了每种方法的优点和缺点,以具有动态搜索条件:

          http://www.sommarskog.se/dyn-search.html

          【讨论】:

            【解决方案6】:

            一种方式:

            SELECT * 
            FROM Customer c 
            WHERE c.StateID=@StateID 
                AND (@CountyID IS NULL OR c.CountyID=@CountyID)
                AND (@CityID IS NULL OR c.CityID=@CityID)
            

            另一种方式:

            SELECT * 
            FROM Customer c 
            WHERE c.StateID=@StateID 
                AND c.CountyID=ISNULL(@CountyID, c.CountyID)
                AND c.CityID=ISNULL(@CityID, c.CityId)
            

            【讨论】:

              【解决方案7】:

              用 coalesce 试试,我认为这是一种非常优雅、干净的方法:

              SELECT *
              FROM Customer c
              WHERE
               c.StateID=@StateID 
               AND c.CountyID = COALESCE(@CountyID, c.CountyID)
               AND c.CityID = COALESCE(@CityID, c.CityID)
              

              (请注意 - 这将过滤掉 CountyID 或 CityID 中具有空值的记录。)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-05-28
                • 1970-01-01
                • 1970-01-01
                • 2019-11-16
                • 1970-01-01
                • 1970-01-01
                • 2013-09-08
                • 2014-11-01
                相关资源
                最近更新 更多