为什么零数的 sum() 不是零?

tin*_*lyx 4 aggregate

对于以下查询

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在某些极端情况下,有什么理由必须求和?

Joe*_*ish 5

这是 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 的总和和空集的总和是有用的。