Thread: ORDER BY using specifc values

ORDER BY using specifc values

From
Ian McWilton
Date:
Hi there,

I need to return the results of a SELECT ordered by a 
column but in a way that is neither ascending or 
descending. 

The ORDER BY column can have one of five values and I 
want to specify which values are returned in the list 
in which order.

An example table below shows the data in the DB:

INDEX | VALUE
1, A
2, B
3, B
4, C
5, B

...and what I want is for my queries result to be 
ordered by VALUE with C put first in the list, then A, 
then B.

Having investigated it appears that ORDER BY does not 
seem to be any help as it restricts the ordering to ASC 
or DESC.

The onyl solution I can see isn't at all elegant; issue 
five SELECT statements in sequence and construct one 
list from this five

Does anyone know of another way to do what I want in 
one query?

Regrads,



Ian McWilton.


Re: ORDER BY using specifc values

From
Tom Lane
Date:
Ian McWilton <ian@blazingcactus.com> writes:
> I need to return the results of a SELECT ordered by a 
> column but in a way that is neither ascending or 
> descending. 

> The ORDER BY column can have one of five values and I 
> want to specify which values are returned in the list 
> in which order.

> An example table below shows the data in the DB:

> INDEX | VALUE
> 1, A
> 2, B
> 3, B
> 4, C
> 5, B

> ...and what I want is for my queries result to be 
> ordered by VALUE with C put first in the list, then A, 
> then B.

> Having investigated it appears that ORDER BY does not 
> seem to be any help as it restricts the ordering to ASC 
> or DESC.

Make a function f(x) that converts the stored values into a suitable
ordering, say C -> 1, A -> 2, B -> 3.  Then doORDER BY f(column)

If you have no more-elegant ideas at hand, f() could be defined
using a CASE expression.  In fact you could just write the CASE
expression right in ORDER BY, but if you need the same ordering
in many different queries then defining a function is probably
the way to go.
        regards, tom lane


Re: ORDER BY using specifc values

From
Oliver Mueschke
Date:
On Wed, Apr 12, 2000 at 04:31:18PM -0700, Ian McWilton wrote:
> I need to return the results of a SELECT ordered by a 
> column but in a way that is neither ascending or 
> descending. 
> 
> The ORDER BY column can have one of five values and I 
> want to specify which values are returned in the list 
> in which order.
> 
> An example table below shows the data in the DB:
> 
> INDEX | VALUE
> 1, A
> 2, B
> 3, B
> 4, C
> 5, B

in 6.5.3:

wb_data=> create table x(i int, t text);
CREATE
wb_data=> insert into x values(1,'A');
INSERT 21514 1
wb_data=> insert into x values(2,'C');
INSERT 21515 1
wb_data=> insert into x values(3,'A');
INSERT 21516 1
wb_data=> insert into x values(4,'B');
INSERT 21517 1
wb_data=> select * from x order by t;
i|t
-+-
1|A
3|A
4|B
2|C
(4 rows)

wb_data=> select 
wb_data->   i, t, 
wb_data->   case
wb_data->     when t='C' then 1                                   
wb_data->     when t='A' then 2 
wb_data->     when t='B' then 3 
wb_data->   end as oby                     
wb_data-> from x 
wb_data-> order by oby;
i|t|oby
-+-+---
2|C|  1
1|A|  2
3|A|  2
4|B|  3
(4 rows)
 oliver