SQL Coalesce在WHERE子句中

时间:2009-03-11 15:46:28

标签: sql sql-server

我正在尝试在我拥有的存储过程中实现可选参数,但我遇到了问题。这是一个简化的查询来说明问题:

SET ANSI_NULLS OFF

DECLARE @MiddleName VARCHAR(20);
SET @MiddleName = NULL;

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND [MiddleName] = COALESCE(@MiddleName, [MiddleName])

当我运行此查询时,我需要返回一行,因为一个Torres在[MiddleName]列中有NULL。但查询返回零行。使用IFNULL()产生相同的结果。通过研究COALESCE,我的印象是如果所有表达式都为NULL,则返回NULL。由于我不是SQL专家,我认为我错过了一些东西,但它是什么......

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:15)

问题是在sql中,“WHERE Null = Null”永远不会返回任何行,因为Null不等于它。

你必须做

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ( @MiddleName IS NULL OR [MiddleName] = @MiddleName )

答案 1 :(得分:3)

您声明您正在查找查询以返回字段MiddleName为NULL的行。不幸的是(NULL = NULL)不返回true,它返回NULL。

你需要像...这样的东西。

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)

答案 2 :(得分:2)

你想这样做吗?

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)

根据我的理解它看起来像。

答案 3 :(得分:2)

COALESCE参数和NULL列均为@MiddleName时,MiddleName会返回NULL,但测试将评估为假,因为{{3} }}

要解决此问题,您应该明确测试@MiddleName参数的无效性:

SELECT *
FROM [Customer]
WHERE [LastName] = 'Torres'
    AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName)