Aggregate
為什麼零數字的 sum() 不為零?
對於以下查詢
SELECT sum(c) FROM (SELECT 1 c WHERE false) t;
我認為它需要零數字的總和,因此應該返回
0
. (同樣,我希望,例如數組聚合函式在零元素上返回一個空數組)。然而,它正在返回一個
NULL
(使用 PostgreSQL 11)。=> SELECT sum(c) FROM (SELECT 1 c WHERE false) t; sum ----- (1 row)
這在邏輯上對我來說沒有意義。
為什麼零數字的總和(對於任何數字類型)不為零?這是 NULL 返回行為標準嗎?
或者,也許我錯過了一些東西。有什麼理由必須
NULL
在某些極端情況下求和?
這是 SQL 標準的要求。我最熟悉1992 年標準。引用它,重點是我的:
一般規則
- 案例:
a) 如果指定了 COUNT(*),則結果是 T 的基數。
6.5
b) 否則,令 TX 為單列表,它是將 應用於 T 的每一行並消除空值的結果。如果消除了一個或多個空值,則提出完成條件:警告 - 在 set 函式中消除空值。
- 如果指定了 DISTINCT,則令 TXA 為
從 TX 中消除冗餘重複值的結果。否則,令 TXA 為
TX。
案子:
a) 如果指定了 COUNT,則結果是 TXA 的基數。
b) 如果指定了 AVG、MAX、MIN 或 SUM,則
案子:
i) 如果 TXA 為空,則結果為空值。
簡而言之,NULL 總是從 SUM、MAX、MIN 和 AVG 的結果中排除。我不能確切地告訴你為什麼會這樣,除了我認為能夠區分單個值 0 的總和和空集的總和是有用的。