异常的sql server查询结果

时间:2015-06-02 06:42:27

标签: sql sql-server database sql-server-2008-r2

我们说我有一张名为nameAge的表格:

ID  Name  Age
1   X     12
2   Y     12
3   null  null
4   Z     12

当我运行如下查询时:

select * from nameAge where Age <> 12

它返回一个空的结果集,而我的行id 3 agenull不同?

使用Sql Server 2008 R2

有什么想法吗?

编辑:与建议答案重复的可能性可能在某一点上,但根本没有涵盖,它显示了与null相比时如何使用空值但我想问的是关于包含空值的结果集

3 个答案:

答案 0 :(得分:16)

这是预期的行为。您无法使用NULL=比较<>值。您必须使用IS NULLIS 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

不会返回TRUEFALSE,但实际上会返回UNKNOWN。这意味着您的查询不会返回表格中的第三条记录。

正如@ughai所提到的,您应该使用IS NULL来查询该记录:

SELECT * FROM nameAge WHERE age IS NULL

有关详细信息,请查看Microsoft SQL Server documentation

答案 2 :(得分:4)

当您处理NULLs时,由于Sql Server中使用了3个有价值的逻辑(当谓词可以评估为TRUEFALSEUNKNOWN)。现在这是一个经典的select语句,其中许多新手犯了一个错误,建议该语句将返回Age <> 12包括NULLs的所有行。

但是,如果您知道将NULL与任何值进行比较的简单事实,即使NULL本身也会评估为UNKNOWN,它会更清楚地发生了什么。 WHERE子句将返回 ONLY 谓词评估为TRUE的行。谓词评估为FALSEUNKNOWN的行将从结果集中过滤掉。

现在让我们看看幕后发生了什么。你有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