sql-server - IS NULL 时的 SQL Server Case Statement - 其他 SO 问题不能解决此问题
问题描述
SO上有2个问题,但它们不同,并不能解决这个问题。在将其标记为重复之前,请随意对其进行测试。
这个问题有一个SQLFiddle。
在此示例中,手机号码可能为 NULL
ID | 姓名 | 细胞 |
---|---|---|
1 | 约翰 | 123 |
2 | 莎莉 | 无效的 |
当单元格编号不为空时,查询有效:
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
以解决实际问题。
解决方案
NULL
不等于任何东西,包括NULL
但你可以检查是否有东西NULL
WHERE (@Cell IS NULL AND Cell IS NULL) OR Cell = @Cell
可能也可以将比较移到里面CASE
,但这至少在含义上是明确的。
推荐阅读
- javascript - 节点检查脚本是乱码并且与原始脚本不同
- mysql - 试图将数据插入到 mysql 表中,但最终都在一列中
- java - java - 如何在java中的每个arraylist中创建具有不同类型对象的arraylist数组?
- python - 避免使用非常大的负数python从指数溢出
- c++ - How to find out if integer_sequence contains given number in compile-time?
- mysql - 有没有办法只加密尚未加密的数据?
- vba - VBA如何根据变量然后优先级找到特定数字
- python - 如何在 django ModelForm 中选择输入字段?
- database - 如何用另一个表中的数据填充一行?
- c# - C# 无法从 DbContext 中删除对象