2

当我使用

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在没有明确说明的情况下会删除该值?

4

3 回答 3

5

SQLNULL表示

我不知道

所以NULL不是一个值。

于 2018-06-11T19:06:36.387 回答
1

为什么在没有明确说明的情况下会删除 NULL 值?

因为这不是真的NULL <> 800

作为一个未知量,NULL 可能等于 800,也可能不等于。唯一知道的就是它IS NULL。NULL 的任何相等或不相等测试将始终返回 false。

编辑:这是一个奇怪的闪存实现...NULL 是 SQL 宇宙的薛定谔猫。:)

于 2018-06-11T19:09:23.020 回答
1

这就是 SQL NULL 比较的工作原理。在 where 子句中消除了 NULL。这也是因为 SET ANSI_NULL ON 设置。默认情况下,它是开启的。

在这里看到一个很好的解释

您可以通过说明来尝试查询

SET ANSI_NULL OFF
GO
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800

这将给出正确的输出

于 2018-06-11T19:12:05.807 回答