Re: order by
От | Joel Burton |
---|---|
Тема | Re: order by |
Дата | |
Msg-id | JGEPJNMCKODMDHGOBKDNKEBACOAA.joel@joelburton.com обсуждение исходный текст |
Ответ на |
order by |
Ответы |
Re: order by |
Список | pgsql-sql |
> -----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 RETURN2; 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
В списке pgsql-sql по дате отправления: