Re: CASE/WHEN behavior with NULLS

From: David Johnston <polobo(at)yahoo(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
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:07:13
Message-ID: CF7D0EF2-A09E-44F7-BE2E-5E6BBC1EE394@yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

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:
>> On Aug 31, 2012, at 19:14, Thalis Kalfigkopoulos <tkalfigo(at)gmail(dot)com> wrote:
>>> This didn't work as expected (the NULL's persisted):
>>> ...CASE sum(foo) WHEN NULL THEN 0 ELSE sum(foo) END...
>
>> Guessing this form effectively evaluates to
>> WHEN sum(foo) = NULL instead of IS NULL and thus the wrong answer:
>
> Yeah, I think that's right.
>
>> 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.

As an alternative for the original question the coalesce(sum(foo),0) form is indeed better.

David J.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Chris Angelico 2012-09-01 02:41:59 Re: CASE/WHEN behavior with NULLS
Previous Message Tom Lane 2012-09-01 01:52:19 Re: CASE/WHEN behavior with NULLS