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() обязан вернуть набор элементов, сохраняя упорядоченность, заданную в массиве. Предполагать и располагать - суть разные подходы :-) Кроме того, может возникнуть задача выбрать элементы в обратном порядке.
хотя может оптимизатор ее и сам выбросит.
DI> В этом примере foo - исходная таблица с данными, DI> id - псевдотаблица с 2-мя столбцами: значение (собственно id) DI> и его порядковый номер.