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 по дате отправления:

Предыдущее
От: "Dmitry E. Oboukhov"
Дата:
Сообщение: Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
Следующее
От: "Dmitry E. Oboukhov"
Дата:
Сообщение: аналог mysql'ногоSQL_CALC_FOUND_ROWS