Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
От | Maxim Boguk |
---|---|
Тема | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке |
Дата | |
Msg-id | 4D7F1F49.4040809@masterhost.ru обсуждение исходный текст |
Ответ на | Сортировка в требуемом порядке (Олекс й Василь в <leopard_ne@inbox.ru>) |
Список | pgsql-ru-general |
On 15/03/11 08:22, Dmitry E. Oboukhov wrote: > > DI> 14 марта 2011 г. 17:20 пользователь Олекс й Василь в<leopard_ne@inbox.ru> > DI> написал: > > DI> Есть такой запрос: > DI> Select * from foo where catalog_id IN(2,3,6,1,4,66,44,23,45) > > DI> Возможно ли вывести результат в таком же порядке, как и условие в IN, > DI> тоесть первый елемент с catalog_id == 2, второй - catalog_id == 3, третий > DI> - catalog_id == 6, четвертый - catalog_id == 1 и т.д. > > DI> Данную задачу можно решить, заменив IN на JOIN, например: > > DI> dmitigr=> > DI> SELECT foo.* FROM (VALUES(1),(2),(3),(4),(6)) AS foo(catalog_id) > DI> JOIN (SELECT id.val, row_number() over() FROM (VALUES(3),(2),(6),(1),(4)) AS > DI> id(val)) AS id > DI> ON (foo.catalog_id = id.val) ORDER BY row_number; > DI> catalog_id > DI> ------------ > DI> 3 > DI> 2 > DI> 6 > DI> 1 > DI> 4 > > > кстати unnest как-то даже покороче выглядит > > SELECT > foo.* > > FROM > unnest('{3,2,6,1,4}'::int[]) idt > > JOIN > foo ON catalog_id = idt > Если оптимизатор выберет hashjoin или mergejoin вместо nested loop то порядок результатов в выдаче будет произволен. Лучше не использовать такой подход. PS: никакой запрос без order by не дает гарантированной сортировки. все ухищрения чтобы без этого обойтись или работают не всегда или могут перестать работать даже при смене минорной версии базы. -- SY, Maxim Boguk
В списке pgsql-ru-general по дате отправления: