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]的操作。