SQL在WHERE子句中合并

SQL在WHERE子句中合并,sql,sql-server,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]) 当我运行这个查询时,我需要返回

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

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专家,我假设我遗漏了一些东西,但它是什么


提前感谢您的帮助。

您想这样做吗

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

据我所知,它看起来是这样的。

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

你必须这样做

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

@MiddleName
参数和
MiddleName
列均为
NULL
时,您的
COALESCE
返回
NULL
,但测试将评估为false,因为

要解决此问题,应显式测试
@MiddleName
参数的空值:

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

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

你需要像

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

您缺少一些括号:([MiddleName]=@MiddleName或[MiddleName]为空)嗯,可能还需要将[MiddleName]先为空[MiddleName]先为空?为什么?错误的方法是,他试图使@MiddleName为NULL时,它被有效忽略,使参数伪可选错误的方法是,他试图使@MiddleName为NULL时,它被有效忽略,使参数伪可选另一种选择是:COALESCE([MiddleName],'')=COALESCE(@MiddleName,[MiddleName],'')使用“@var为空”返回一个常量,乐观主义者可以使用该常量来简化条件。Joel建议的将要求“”与每个中间名进行比较。在David的示例中,中间名永远不需要进行比较,因为乐观主义者知道是真的或始终是真的。我正在尝试正确解释您所说的。我认为您的意思如下:如果为null,如何使用coalesce表示所有行,否则仅表示匹配的行。如果是这种情况,我将在where子句中执行类似coalesce(@MiddleName',)=''或@MiddleName=[MiddleName]的操作。