Aggregate

為什麼零數字的 sum() 不為零?

  • May 15, 2019

對於以下查詢

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 年標準。引用它,重點是我的:

一般規則

  1. 案例:

a) 如果指定了 COUNT(*),則結果是 T 的基數。

6.5

b) 否則,令 TX 為單列表,它是將 應用於 T 的每一行並消除空值的結果。如果消除了一個或多個空值,則提出完成條件:警告 - 在 set 函式中消除空值。

  1. 如果指定了 DISTINCT,則令 TXA 為

從 TX 中消除冗餘重複值的結果。否則,令 TXA 為

TX。

案子:

a) 如果指定了 COUNT,則結果是 TXA 的基數。

b) 如果指定了 AVG、MAX、MIN 或 SUM,則

案子:

i) 如果 TXA 為空,則結果為空值。

簡而言之,NULL 總是從 SUM、MAX、MIN 和 AVG 的結果中排除。我不能確切地告訴你為什麼會這樣,除了我認為能夠區分單個值 0 的總和和空集的總和是有用的。

引用自:https://dba.stackexchange.com/questions/238181