为什么在结果中省略了 WHERE 子句中使用的列中具有 NULL 的行?

Why rows with NULL in column used in WHERE clause are omitted in results?

是 SQL 服务器中的错误还是我不知道什么?

我有 table 个结构的“项目”:

Id - (PRIMARY)  int Auto Increment
FinalStatus - tinyint (NULLABLE)

数据看起来像:

Id Status
1 NULL
2 NULL
3 NULL
4 1
5 2

我正在尝试列出状态不同于 2 的所有记录:

SELECT * FROM [Items] WHERE [Status] != '2'

SELECT * FROM [Items] WHERE [Status] != 2

SELECT * FROM [Items] WHERE [Status] NOT LIKE '2'

SELECT * FROM [Items] WHERE [Status] NOT IN (2)

所有这些查询 returns 只有一行:

Id Status
4 1

但是如果我使用查询:

SELECT * FROM [Items] WHERE [Status] IS NULL

在那种情况下,我会显示所有 NULL 行 - 但只有它们。

由于 NULL 与 2 或任何其他数字不同,我对查询结果感到困惑。但是,我设计这个 table 的方式与之前的设计方式有所不同。 这次我忘记了在创建时允许空值,然后我使用 SQL studio 来完成它。恕我直言,这就是麻烦的原因,但我不知道它到底是什么。 我可以删除 table 并重新创建它,但我想学习一些东西。 感谢大家的帮助。

使用这个查询 SELECT * FROM [Items] WHERE ISNULL([Status], 0) != 2

Is that bug in SQL server or I don't know something

好吧,这不是错误。

NULL视为“未知”的占位符,这样会更清楚。

如果我要求你找到值不是 2 的所有行,那么你 不能 return 任何 NULL(未知)值,因为你不知道它不是 2

如果你想包含 NULL,那么标准应该是

where value != 2 or value is null;