Select 未明确说明时不包括空值
Select Not Including Nulls when not explicitly stated
当我使用
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
我得到返回的输出:
+----------+
| Brand_ID |
+----------+
| 100 |
| 200 |
| 300 |
| 400 |
| 500 |
| 600 |
| 700 |
| 900 |
+----------+
但是,该列确实包含存在的 NULL 值。
我需要更新我的 select 声明以明确地说:
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800 OR Brand_ID IS NULL
获得正确的输出:
+----------+
| Brand_ID |
+----------+
| NULL |
| 100 |
| 200 |
| 300 |
| 400 |
| 500 |
| 600 |
| 700 |
| 900 |
+----------+
为什么 NULL
值在未明确说明时被删除?
SQL NULL
表示
I don't know
所以 NULL
不是一个值。
Why does the NULL value get removed when not explicitly stated?
因为 NULL <> 800
不是真的
作为未知数,NULL 可能等于 800,也可能不等于。唯一知道的是它 IS NULL
。 NULL 的任何相等或不相等测试将始终 return false。
编辑:这是一个奇怪的闪光实现......NULL 是 SQL 宇宙的薛定谔的猫。 :)
这就是 SQL NULL 比较的工作原理。 NULL 在您的 where 子句中被消除。
这也是因为 SET ANSI_NULL ON 的设置。
默认情况下它是打开的。
在此处查看 excellent explanation
您可以通过陈述
来尝试您的查询
SET ANSI_NULL OFF
GO
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
这将给出正确的输出
当我使用
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
我得到返回的输出:
+----------+
| Brand_ID |
+----------+
| 100 |
| 200 |
| 300 |
| 400 |
| 500 |
| 600 |
| 700 |
| 900 |
+----------+
但是,该列确实包含存在的 NULL 值。 我需要更新我的 select 声明以明确地说:
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800 OR Brand_ID IS NULL
获得正确的输出:
+----------+
| Brand_ID |
+----------+
| NULL |
| 100 |
| 200 |
| 300 |
| 400 |
| 500 |
| 600 |
| 700 |
| 900 |
+----------+
为什么 NULL
值在未明确说明时被删除?
SQL NULL
表示
I don't know
所以 NULL
不是一个值。
Why does the NULL value get removed when not explicitly stated?
因为 NULL <> 800
作为未知数,NULL 可能等于 800,也可能不等于。唯一知道的是它 IS NULL
。 NULL 的任何相等或不相等测试将始终 return false。
编辑:这是一个奇怪的闪光实现......NULL 是 SQL 宇宙的薛定谔的猫。 :)
这就是 SQL NULL 比较的工作原理。 NULL 在您的 where 子句中被消除。 这也是因为 SET ANSI_NULL ON 的设置。 默认情况下它是打开的。
在此处查看 excellent explanation
您可以通过陈述
来尝试您的查询SET ANSI_NULL OFF
GO
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
这将给出正确的输出