Re: ORDER BY - problem with NULL values

From: Rodrigo Gonzalez <rjgonzale(at)gmail(dot)com>
To: Richard Huxton <dev(at)archonet(dot)com>
Cc: Stefan Schwarzer <stefan(dot)schwarzer(at)grid(dot)unep(dot)ch>, pgsql-general(at)postgresql(dot)org
Subject: Re: ORDER BY - problem with NULL values
Date: 2007-10-10 14:41:36
Message-ID: 470CE4A0.3040106@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Richard Huxton escribió:
> Stefan Schwarzer wrote:
>>>> Hi there,
>>>> if I order a given year in DESCending ORDER, so that the highest
>>>> values (of a given variable) for the countries are displayed at the
>>>> top of the list, then actually the NULL values appear as first.
>>>> Only below, I find the values ordered correctly.
>>>> Is there any way to
>>>> a) make the countries with NULL values appear at the bottom of
>>>> the list
>>>> b) neglect the NULL values by still allowing the countries to be
>>>> displayed
>>>
>>> Not sure what you mean by (b), but (a) is straightforward enough.
>>>
>>> => SELECT * FROM (SELECT 1 as a UNION SELECT 2 UNION SELECT
>>> null::int) AS foo ORDER BY (a is null), a DESC;
>>> a
>>> ---
>>> 2
>>> 1
>>>
>>> (3 rows)
>>
>> Looks easy.
>>
>> If I apply this to my SQL:
>>
>> SELECT
>> SUM(CASE WHEN year=2002 THEN value ELSE NULL END) AS "y_2002",
>> SUM(CASE WHEN year=2001 THEN value ELSE NULL END) AS "y_2001",
>> SUM(CASE WHEN year=2000 THEN value ELSE NULL END) AS "y_2000",
>> c.name AS name
>> FROM
>> aquacult_prod_marine AS d
>> LEFT JOIN
>> countries AS c ON c.id = id_country
>> GROUP BY
>> name
>> ORDER BY
>> y_2000 DESC
>>
>> I would then say:
>>
>> ORDER BY
>> (y_2000 is null),
>> y_2000 DESC
>>
>> But then I get an Error warning:
>>
>> ERROR: column "y_2000" does not exist
>>
>> What do I do wrong?
>
> Hmm... Nothing.
>
> The "ORDER BY" clause should get processed last, after column-aliasing
> (which labels your column "y_2000"). However, it seems like PG is
> evaluating the (X is null) clause earlier.
>
> => SELECT version,count(*) AS ct FROM items.wiki_items GROUP BY
> version ORDER BY (ct IS NULL);
> ERROR: column "ct" does not exist
> ^
> => SELECT version,count(*) AS ct FROM items.wiki_items GROUP BY
> version ORDER BY (count(*) IS NULL);
> ...works...
>
> I can see why, but it's a pain.
>
> You've got two options:
> 1. Repeat the expression as I've done above
> ORDER BY (CASE (...) END IS NULL), y_2000 DESC
> 2. Wrap your query in another query so the column aliases are available:
> SELECT * FROM (<your query>) AS results ORDER BY y_2000 IS NULL,
> y_2000 DESC
>
>
From 8.3 beta release notes:
- ORDER BY ... NULLS FIRST/LAST

I think this is what you want right?

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Scott Marlowe 2007-10-10 15:22:55 Re: pgodbc + Excel + msquery + background refresh
Previous Message Sam Mason 2007-10-10 14:02:27 Re: disjoint union types