Re: CASE in ORDER BY clause

From: Perry Smith <pedz(at)easesoftware(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Gregory Stark <stark(at)enterprisedb(dot)com>, pgsql-general(at)postgresql(dot)org
Subject: Re: CASE in ORDER BY clause
Date: 2007-07-07 19:22:35
Message-ID: 46209A9C-0B43-4F36-970B-4BA18B55619F@easesoftware.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


On Jul 7, 2007, at 2:15 PM, Tom Lane wrote:

> Perry Smith <pedz(at)easesoftware(dot)com> writes:
>>> On Fri, Jul 06, 2007 at 08:02:54PM +0400, Viatcheslav Kalinin wrote:
>> # select start_date from show_date
>> # order by
>> # case when start_date > CURRENT_DATE then start_date end desc,
>> # case when start_date <= CURRENT_DATE then start_date end asc;
>>
>> I am very novice, but that looks odd to me. I would have expected
>> the asc or desc keywords need to go inside the case (before the
>> end).
>
> No, the syntax is
> ORDER BY <expr> ASC, ...
> or
> ORDER BY <expr> DESC, ...
>
> and in this case the expression is a CASE construct. Viatcheslav
> is omitting an ELSE clause which means there is an implied ELSE NULL
> in each of the CASEs, and he's relying on some rules he didn't mention
> about NULLs sorting before or after all non-null values, plus the
> normal behavior of two-column sorts.
>
> The bottom line is that ASC and DESC can only appear at the top
> level of
> the ORDER BY syntax. I have no idea what it would mean to put them
> somewhere else --- you'd have to invent semantics like mad to assign a
> meaning to that at all.

I see. So, in effect he has:

ORDER BY NULL DESC, start_date ASC;

or

ORDER BY start_date DESC, NULL ASC;

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message rupesh bajaj 2007-07-07 19:53:22 Crash in PostgreSQL-8.2.4 while executing query
Previous Message Martijn van Oosterhout 2007-07-07 19:18:56 Re: CASE in ORDER BY clause