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

From Dmitriy Igrishin
Subject Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
Date
Msg-id AANLkTi=VgG7DfCtpTitXneiS0eWrJPBmvOo14Q8ez9Pe@mail.gmail.com
Whole thread Raw
In response to Сортировка в требуемом порядке  (Олекс й Василь в <leopard_ne@inbox.ru>)
Responses Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
List pgsql-ru-general


14 марта 2011 г. 22:22 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:

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

WHERE
   foo.id IS NOT NULL;

и от сортировки можно избавиться
К сожалению, нигде не сказано, что unnest() обязан
вернуть набор элементов, сохраняя упорядоченность,
заданную в массиве. Предполагать и располагать -
суть разные подходы :-)
Кроме того, может возникнуть задача выбрать элементы
в обратном порядке.

хотя может оптимизатор ее и сам выбросит.

DI> В этом примере foo - исходная таблица с данными,
DI> id - псевдотаблица с 2-мя столбцами: значение (собственно id)
DI> и его порядковый номер.
--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
 `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537



--
// Dmitriy.


pgsql-ru-general by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Re: [pgsql-ru-general] Сортировка в требуемом порядке
Next
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке