当我使用
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
我得到返回的输出:
+----------+
| Brand_ID |
+----------+
| 100 |
| 200 |
| 300 |
| 400 |
| 500 |
| 600 |
| 700 |
| 900 |
+----------+
但是,该列确实包含存在的 NULL 值。 我需要更新我的选择语句以明确说:
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
值?
SQLNULL
的意思
我不知道
所以NULL
不是一个值。
这就是 SQL NULL 比较的工作方式。在 where 子句中消除 NULL 。 这也是因为设置ANSI_NULL ON设置。 默认情况下,它处于打开状态。
在此处查看出色的解释
您可以通过说明来尝试查询
SET ANSI_NULL OFF
GO
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800
这将给出正确的输出
为什么在未明确说明的情况下会删除 NULL 值?
因为NULL <> 800
不是真的
作为未知数量,NULL 可能等于 800,也可能不等于。 关于它的唯一了解是它IS NULL
. NULL 的任何相等或非相等检验将始终返回 false。
编辑:这是一个奇怪的闪光实现...NULL 是 SQL 宇宙中的薛定谔之猫。 : )