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

这将给出正确的输出