pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Joel Burton <joel@joelburton.com>
To: Mathieu Arnold <mat@mat.cc>
To: pgsql-sql@postgresql.org
Subject: Re: order by <something wierd>
Date: Tue, 14 May 2002 08:05:08 -0400
Message-ID: <JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com> (raw)
In-Reply-To: <1713675304.1021384181@andromede.reaumur.absolight.net>

> -----Original Message-----
> From: pgsql-sql-owner@postgresql.org
> [mailto:pgsql-sql-owner@postgresql.org]On Behalf Of Mathieu Arnold
> Sent: Tuesday, May 14, 2002 7:50 AM
> To: pgsql-sql@postgresql.org
> Subject: [SQL] order by <something wierd>
>
>
> Hi
>
> I have :
>
> table a (int, varchar, int)
>
> 1 | one   | 1
> 2 | two   | 3
> 3 | three | 2
> 4 | four  | 3
> 5 | five  | 2
>
> And I would like to select it and sort it so that the 3rd field
> is first 2,
> then 1 and then 3. so that the result should be :
>
> 1 | one   | 1
> 3 | three | 2
> 5 | five  | 2
> 2 | two   | 3
> 4 | four  | 3
>
> How could I do that ?

Mathieu --

You're asking to have it be sorted as {2,1,3}, but the sample result data
you give seems to sort by {1,2,3}. Or am I misunderstanding your question?

In any event, some possible solutions:

1) custom function

  CREATE OR REPLACE FUNCTION weird_sort(int) RETURNS int AS '
  BEGIN
    IF $1=2 THEN
      RETURN 1;
    ELSIF $1=1 THEN
      RETURN 2;
    ELSE RETURN 3;
    END IF;
  END'
  LANGUAGE plpgsql;

 then

  SELECT * FROM a ORDER BY weird_sort(col3);

 The nice thing about this is that you could index the result of
weird_sort(col3), so it could perform better.


2) inlined in sql

  SELECT * FROM a
  ORDER BY CASE WHEN col3=2 THEN 1
                WHEN col3=1 THEN 2
                ELSE 3
            END;


3) union

  SELECT * FROM a
  WHERE col3=2

  UNION ALL

  SELECT * FROM a
  WHERE col3=1

  UNION ALL

  SELECT * FROM a
  WHERE col3=3;


#1 (with index) or #3 might perform better. Test with your data and see.

Joel BURTON | joel@joelburton.com | joelburton.com | aim: wjoelburton
Knowledge Management & Technology Consultant




view thread (8+ messages)  latest in thread

Message-ID: <JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com>
Permalink:  ../JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com/
Also on:    postgresql.org/message-id/JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: joel@joelburton.com, mat@mat.cc
  Subject: Re: order by <something wierd>
  In-Reply-To: <JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox