Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке

From: Maxim Boguk <mboguk(at)masterhost(dot)ru>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
Date: 2011-03-15 08:11:53
Message-ID: 4D7F1F49.4040809@masterhost.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

On 15/03/11 08:22, Dmitry E. Oboukhov wrote:
>
> DI> 14 марта 2011 г. 17:20 пользователь Олекс й Василь в<leopard_ne(at)inbox(dot)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

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message Dmitry E. Oboukhov 2011-03-20 07:48:06 аналог mysql'ного SQL_CALC_FOUND_ROWS
Previous Message Dmitry E. Oboukhov 2011-03-14 21:25:27 Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке