SQL IS NULL 时的服务器案例声明 - 其他 SO 问题无法解决此问题

SQL Server Case Statement when IS NULL - Other SO questions do not solve this issue

SO上有2个问题,但是不同,都没有解决这个问题。在将其标记为重复之前,请随意对其进行测试。

这个问题有一个SQLFiddle

在此示例中,单元格 phone 编号可能为 NULL

ID Name Cell
1 John 123
2 Sally NULL

单元格号不为空时查询有效:

DECLARE @Cell NVARCHAR(100) = '123'

SELECT * 
FROM Temp
WHERE Cell = CASE WHEN @Cell IS NULL THEN NULL ELSE @Cell END

当单元格号为空时,相同的查询失败。

DECLARE @Cell NVARCHAR(100) = NULL

SELECT * 
FROM Temp
WHERE Cell = CASE WHEN @Cell IS NULL THEN NULL ELSE @Cell END

问题是如何让 CASE WHEN 对 NULL 和比较实际值时都起作用。请注意,这是实际问题的简化示例(有更多的条件和额外的复杂性),重点是通过修改 CASE WHEN 来使示例正常工作,以解决实际问题。

你可以不使用 CASE 表达式,使用 COALESCE():

DECLARE @Cell NVARCHAR(100) = ?
Select * from Temp
WHERE Cell = @Cell OR COALESCE(Cell, @Cell) IS NULL;

? 替换为您搜索的值或 NULL

参见demo

NULL 不等于任何东西,包括 NULL 但你可以检查是否有东西是 NULL

WHERE (@Cell IS NULL AND Cell IS NULL) OR Cell = @Cell

可能也可以将比较移到 CASE 内,但这至少在意思上很清楚。