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

时间:2018-06-11 19:04:25

标签: sql sql-server

当我使用

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值?

3 个答案:

答案 0 :(得分:5)

SQL NULL表示

  

我不知道

所以NULL不是值。

答案 1 :(得分:1)

  

为什么没有明确说明时会删除NULL值?

因为NULL <> 800

不正确

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

编辑:这是一个奇怪的闪存实现...... NULL是Schroedinger的SQL Universe的猫。 :)

答案 2 :(得分:1)

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

在此处查看 excellent explanation

您可以通过陈述

来尝试查询
SET ANSI_NULL OFF
GO
Select Distinct Brand_ID
from db.ABC
WHERE
Brand_ID <> 800

这将提供正确的输出