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
内,但这至少在意思上很清楚。
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
内,但这至少在意思上很清楚。