选择"未明确说明时不包括空值"



当我使用

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 宇宙中的薛定谔之猫。 : )

最新更新