为什么在结果中省略了 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;
是 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;