From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | David Johnston <polobo(at)yahoo(dot)com> |
Cc: | Thalis Kalfigkopoulos <tkalfigo(at)gmail(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: CASE/WHEN behavior with NULLS |
Date: | 2012-09-01 02:49:49 |
Message-ID: | 29330.1346467789@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
David Johnston <polobo(at)yahoo(dot)com> writes:
> On Aug 31, 2012, at 21:52, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>> David Johnston <polobo(at)yahoo(dot)com> writes:
>>> That said you might want to try
>>> SUM(COALESCE(foo, 0))
>> Actually I'd go with "COALESCE(SUM(foo), 0)" since that requires only
>> one COALESCE operation, not one per row.
> These are not equivalent if some values of foo are not-null and you want the sum of all non-null values while replacing any nulls with zero. So the decision depends on what and why you are summing.
But SUM() ignores input nulls, so I think they really are equivalent.
I agree that in a lot of other cases (for instance MAX), you'd have to
think harder about which behavior you wanted.
The key point here is that whatever is inside the aggregate function
call is computed once per row, and then the aggregate is applied to
those results, and then whatever is outside the aggregate is done once
on the aggregate's result. SQL's syntax doesn't make this too obvious,
but you really have to grasp that to make any sense of what's happening.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | David Johnston | 2012-09-01 03:19:27 | Re: CASE/WHEN behavior with NULLS |
Previous Message | Chris Angelico | 2012-09-01 02:41:59 | Re: CASE/WHEN behavior with NULLS |