SQL Server中where子句中的CASE对NULL值不起作用

3
我希望的是,当@AddressCode为空时,直接执行。
SELECT
    *
FROM
    Addresses
WHERE
    1= 1

如果@AddressCode不为空,则执行

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

我该如何实现这个功能...我尝试了下面的查询语句,但是当Address中的值为NULL或者@AddressCode is NULL时无法运行...(Addresses只是一个虚构的表名)

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),所以不想这样做 :(


ISNULL在这里是你的好朋友... - Grantly
2个回答

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

2
如果地址代码已经被索引,您需要在使用@AddressCode IS NOT NULL的情况下使用RECOMPILE以防止不必要的扫描。 - Martin Smith
谢谢,它运行得很好,真是太棒了 :) 最初我错过了where语句中的括号,所以出现了问题,但我已经修复了它。 - prsthapit

4

在此情况下(与 null 比较),您错误地使用了 CASE。正确的方法是:

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

您的查询问题在于CASE a WHEN b THEN c...检测是否a=b,如果其中一个操作数为空,则变为FALSE(NULL)。
另一个问题是您是否真的需要在此处使用CASE...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接