aggregate of an empty result set

后端 未结 4 1673
一向
一向 2021-02-13 19:17

I would like the aggregates of an empty result set to be 0. I have tried the following:

SELECT SUM(COALESCE(capacity, 0))
  FROM objects
 WHERE null IS NOT NULL;         


        
4条回答
  •  无人共我
    2021-02-13 19:59

    From the documentation page about aggregate functions:

    It should be noted that except for count, these functions return a null value when no rows are selected. In particular, sum of no rows returns null, not zero as one might expect. The coalesce function may be used to substitute zero for null when necessary.

    So, if you want to guarantee a value returned, apply COALESCE to the result of SUM, not to its argument:

    SELECT COALESCE(SUM(capacity), 0) …
    

    As for the Oracle 'subquestion', well, I couldn't find any notion of NULLs at the official doc page (the one for 10.2, in particular), but two other sources are unambiguous:

    • Oracle SQL Functions:

      SUM([DISTINCT] n) Sum of values of n, ignoring NULLs

    • sum aggregate function [Oracle SQL]:

      …if a sum() is created over some numbers, nulls are disregarded, as the following example shows…

    That is, you needn't apply NVL to capacity. (But, like with COALESCE in PostgreSQL, you might want to apply it to SUM.)

提交回复
热议问题