SQL Coalesce在WHERE子句中

mpe*_*erb 6 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])
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助.

Dav*_*vid 16

问题是在sql中,"WHERE Null = Null"永远不会返回任何行,因为Null不等于它自己.

你必须做

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ( @MiddleName IS NULL OR [MiddleName] = @MiddleName )
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择是:COALESCE([MiddleName],'')= COALESCE(@ MiddleName,[MiddleName],'') (5认同)
  • 使用“@var IS NULL”返回一个常量,优化器可以使用该常量来简化条件。Joel 的建议要求 '' 与每个中间名进行比较。在 David 的示例中,不需要比较 MiddleName,因为优化器知道 TRUE OR <anything> 始终为 true。 (3认同)