我正在尝试在我拥有的存储过程中实现可选参数,但我遇到了问题。这是一个简化的查询来说明问题:
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专家,我认为我错过了一些东西,但它是什么......
提前感谢您的帮助。
答案 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)