Postgresql

當沒有匹配的記錄時,為什麼 SELECTing sum() 返回 null 而不是 0?

  • January 13, 2022

這只是無數小細節之一,讓我一直感到沮喪,迫使我記住各種特殊程式碼,並使我的查詢變得比他們應該的更醜陋。

試試這個查詢的大小:

SELECT sum(amount) FROM table WHERE conditions;

如果它沒有找到sum()數量的記錄,它將返回空/空/未定義而不是 0,從而導致我的應用程序中的輸出意外地為空,而不是零的“總和”。但是sum()意味著“總和”,那麼為什麼不直接返回 0?

我知道解決方案。你“簡單地”做:

SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;

現在即使沒有記錄它也會返回 0。但它很醜,使用起來不再感覺“有趣”。並不是說數據庫應該是一個“有趣的遊戲”,但你知道我的意思:如果一個查詢變得太複雜/“醜陋”,使用它就不再令人滿意,特別是如果你知道這必須是在各種地方重複,這不僅僅是一些晦澀的、一次性的邊緣案例。

使它表現出這樣的行為背後的思考過程是什麼?我還有很多其他相關的問題null,但是對於這個問題,我將專注於這一件事。

這是 SQL 標准在第4.16.4 節聚合函式中指定的:

如果沒有行符合條件,則 COUNT 的結果為 0(零),任何其他聚合函式的結果為空值。

如果它沒有找到 sum() 數量的記錄,它將返回空/空/未定義而不是 0,導致我的應用程序中的輸出意外地為空,而不是零的“總和”。但是 sum() 的意思是“總和”,那麼為什麼不直接返回 0 呢?

僅僅是因為:

NULL  !=  0 

NULL 不是任何類型的預設值,也不是任何類型的已知值。

這是記錄任何有意義的價值缺失的刻意手段。

NULL 的總和為 NULL。NULL 上的任何
聚合函式 的結果都是 NULL。對 NULL 的任何操作 的結果都是NULL。

這是一個“有趣”的問題:

NULL 不等於其他任何東西,甚至不等於 NULL本身

NULL is NULL    True
NULL =  NULL    False
NULL != NULL    False

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