对于以下查询
SELECT sum(c)
FROM (SELECT 1 c WHERE false) t;
Run Code Online (Sandbox Code Playgroud)
我认为它需要零个数字的总和,因此应该返回0
. (同样,我希望,例如,数组聚合函数返回零元素上的空数组)。
然而,它返回一个NULL
(使用 PostgreSQL 11)。
=> SELECT sum(c) FROM (SELECT 1 c WHERE false) t;
sum
-----
(1 row)
Run Code Online (Sandbox Code Playgroud)
这在逻辑上对我来说没有意义。
为什么零数字的总和(对于任何数字类型)不为零?这是 NULL 返回行为标准吗?
或者也许我错过了一些东西。NULL
在某些极端情况下,有什么理由必须求和?
这是 SQL 标准的要求。我最熟悉1992 标准。引用它,重点是我的:
通用规则
1) 案例:
a) 如果指定了 COUNT(*),则结果为 T 的基数。
6.5
b) 否则,令 TX 为单列表,它是将 应用于 T 的每一行并消除空值的结果。如果消除了一个或多个空值,则会引发完成条件:警告- set 函数中消除了空值。
2) 如果指定了 DISTINCT,则令 TXA 为
从 TX中消除冗余重复值的结果。否则,令 TXA 为
TX。案件:
a) 如果指定了 COUNT,则结果为 TXA 的基数。
b) 如果指定了 AVG、MAX、MIN 或 SUM,则
案件:
i) 如果 TXA 为空,则结果为空值。
简而言之,NULL 总是被排除在 SUM、MAX、MIN 和 AVG 的结果之外。我不能确切地告诉你为什么会这样,除了我认为能够区分单个值 0 的总和和空集的总和是有用的。
归档时间: |
|
查看次数: |
714 次 |
最近记录: |