我们说我有一张名为nameAge
的表格:
ID Name Age
1 X 12
2 Y 12
3 null null
4 Z 12
当我运行如下查询时:
select * from nameAge where Age <> 12
它返回一个空的结果集,而我的行id 3
age
与null
不同?
使用Sql Server 2008 R2
。
有什么想法吗?
编辑:与建议答案重复的可能性可能在某一点上,但根本没有涵盖,它显示了与null相比时如何使用空值但我想问的是关于包含空值的结果集
答案 0 :(得分:16)
这是预期的行为。您无法使用NULL
或=
比较<>
值。您必须使用IS NULL
或IS NOT NULL
。
如果您希望NULL
值仅使用IS NULL
:
select * from nameAge where age IS NULL
如果您希望NULL
值为age <> 12
,请使用:
select * from nameAge where age <> 12 OR age IS NULL
答案 1 :(得分:8)
表达式
WHERE NULL <> 12
不会返回TRUE
或FALSE
,但实际上会返回UNKNOWN
。这意味着您的查询不会返回表格中的第三条记录。
正如@ughai所提到的,您应该使用IS NULL
来查询该记录:
SELECT * FROM nameAge WHERE age IS NULL
有关详细信息,请查看Microsoft SQL Server documentation。
答案 2 :(得分:4)
当您处理NULLs
时,由于Sql Server
中使用了3个有价值的逻辑(当谓词可以评估为TRUE
,FALSE
或UNKNOWN
)。现在这是一个经典的select
语句,其中许多新手犯了一个错误,建议该语句将返回Age <> 12
包括NULLs
的所有行。
但是,如果您知道将NULL
与任何值进行比较的简单事实,即使NULL
本身也会评估为UNKNOWN
,它会更清楚地发生了什么。 WHERE
子句将返回 ONLY 谓词评估为TRUE
的行。谓词评估为FALSE
或UNKNOWN
的行将从结果集中过滤掉。
现在让我们看看幕后发生了什么。你有4行:
ID Name Age
1 X 12
2 Y 12
3 null null
4 Z 12
,谓词是:
where Age <> 12
当你为每一行评估这个谓词时:
ID Name Age Evaluation result
1 X 12 FALSE --(because 12 <> 12 is FALSE)
2 Y 12 FALSE --(because 12 <> 12 is FALSE)
3 null null UNKNOWN --(because NULL <> 12 is UNKNOWN)
4 Z 12 FALSE --(because 12 <> 12 is FALSE)
现在请记住,WHERE
子句只返回谓词求值为TRUE
的行,很明显你不会得到任何结果,因为没有行计算为TRUE
。