SQL Server CASE里面的where子句不适用于NULL值

时间:2011-08-30 14:11:21

标签: sql sql-server tsql sql-server-2008

我想要的是@AddressCode为空时然后执行

SELECT
    *
FROM
    Addresses
WHERE
    1= 1

如果@AddressCode不为NULL,则执行

SELECT
    *
FROM
    Addresses
WHERE
    1= 1 AND @AddressCode=Addresses.AddressCode

我如何实现这一点...我尝试了下面的查询,它不适用于具有NULL值的地址或@AddressCode is NULL ....(地址只是一个虚构的表名)

Declare @AddressCode varchar(20)
Set @AddressCode=NULL

SELECT
    *
FROM
    Addresses
WHERE
    1= 1
    AND
    CASE @AddressCode
        WHEN NULL
        THEN Addresses.AddressCode
        ELSE @AddressCode
    END =Addresses.AddressCode

我努力但却无法成功...我知道我可以编写IF语句并编写单独的select语句但不想这样做因为我有很多这样的标准@AddressCode: (

2 个答案:

答案 0 :(得分:11)

SELECT *
FROM
    Addresses
WHERE
    (@AddressCode IS NULL OR Addresses.AddressCode = @AddressCode)

答案 1 :(得分:4)

在这种情况下,您使用的CASE不正确(与null相比)。正确的方法是

CASE
  WHEN @AddressCode IS NULL THEN Addresses.AddressCode
  ELSE  @AddressCode
 END

您的查询存在的问题是CASE a WHEN b THEN c...测试a=b是否变为FALSENULL),如果其中一个操作数为空。
另一个问题是,如果你真的需要CASE这里......