【问题标题】:Select Not Including Nulls when not explicitly stated [duplicate]未明确说明时选择不包括空值[重复]
【发布时间】:2018-06-11 19:04:24
【问题描述】:

当我使用时

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

【问题讨论】:

  • 好问题,不知道答案。
  • NULL 是没有值。在这种情况下,它不是 800
  • @sgeddes 那就是我要找的那个!
  • @GregdeLima 这个功能总是让我很恼火,直到我真正想到 NULL 的含义。 NULL 表示值未知或不可用。所以没有定义真/假值语句。如果我不知道我有多少钱,我有 NULL 钱。这和没钱不一样。我可能有 27 美元,我可能没有,所以“我有 27 美元”的真值是未知的,而不是真假。

标签: sql sql-server sql-null


【解决方案1】:

SQL NULL 表示

我不知道

所以NULL 不是一个值。

【讨论】:

  • 这么简单,却没想到。
  • @TheImpaler 是的NULL是SQL中的一个特殊的
  • 是的,我真傻。
  • 简单又棒!
【解决方案2】:

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

在此处查看 excellent explanation

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

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

这将给出正确的输出

【讨论】:

    【解决方案3】:

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

    因为NULL &lt;&gt; 800不是真的

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多