5

我了解 SQL 标准允许在作为 UNIQUE 约束一部分的列中使用多个 NULL 值。

我不明白为什么 UNION 构造(至少在 PostgreSQL 中)将 NULL 值视为相同。例如:

$ select * from tmp_a;
 a | b
---+---
 a | b
 a |
   |
(3 rows)

$ select * from tmp_b;
 a | b
---+---
 a | c
 a |
   |
(3 rows)

$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2;
 a | b
---+---
 a | b
 a | c
 a |
   |
(4 rows)
4

4 回答 4

3

我找不到更主要的来源,但根据这篇 Wikipedia 文章,在分组操作方面存在 NULL 的特殊情况。对于那些操作,如 DISTINCT 和 UNION,NULL 与 NULL“不不同”,即使两个 NULL 也“不相等”。

于 2011-04-20T03:20:20.580 回答
2

SQL-92 标准中的一般规则如下:

13.1 'declare cursor'(记住ORDER BY是光标的一部分) 一般规则 3b:

下面对空值进行特殊处理。为空的排序键值是否被认为大于或小于非空值是实现定义的,但所有为空的排序键值应被视为大于所有非空值或被视为小于所有非空值-空值。

SQL-89 更清楚地说明了 IMO:

虽然x = y未知 xy是否都是值,但在和 NULL的上下文中GROUP BY,一个值与另一个值相同或重复。ORDER BYDISTINCTNULLNULL

我猜 PostgreSQL 正在执行一种排序以根据要求删除重复项,UNION并根据标准将值分组NULL在一起。

于 2011-04-20T07:59:20.073 回答
1

SQLite 站点上有一个关于此的有趣网页,其中调查了 SQL 实现之间的差异。

于 2011-04-20T03:32:11.880 回答
1

SQL 中对空值的处理从根本上是不一致的,有时甚至是矛盾的。SQL 中的空值行为背后没有逻辑上合理的基础。您只需要了解适用于不同地方的不同规则,然后应用它们或解决它们。

于 2011-04-27T14:17:23.393 回答