Postgresql
當沒有匹配的記錄時,為什麼 SELECTing sum() 返回 null 而不是 0?
這只是無數小細節之一,讓我一直感到沮喪,迫使我記住各種特殊程式碼,並使我的查詢變得比他們應該的更醜陋。
試試這個查詢的大小:
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