среда, марта 25, 2009

Сортируем как хотим

Сегодня, экспериментальным путем, выяснилось, что decode можно ставить даже в order by.
Т. е. запрос вида
select * from tbl1 order by decode(:order_param, 1, param1, 2, param2, param3)
будет работать. Причем на "стоимость" запроса это не повлияет так как сортировка делается после выборки данных.

К сожалению используя этот способ нельзя менять направление сортировки с asc на desc. Но в таком случае может помочь аналитическая функция row_number()
select * from
(select param1, param2, param3, row_number() over (order by decode(:param_num, 1, param1, 2, param2, 3, param3)) rn from tbl1)
order by decode(:order_destination, 'desc', 1/rn, rn)
В этом примере, с помощю функции row_number() мы присваевам каждой строке номер который она получила бы в отсортированном массиве. А в обрамляющем запросе мы или просто сортируем запрос по этому столбцу чтобы получить прямую сортировку, или сортируем по 1/rn и получаем обратную сортировку

Внимание: второй способ я еще не проверял так что он может быть невполне работоспособен, хотя в самом принципе я уверен

P.S. наконец набрал в гугле sql syntax highliter и нашел подсветку для запросов, теперь форматирование запросов будет красивое и одинаковое :)

ER 2.0

Визуализатор баз данных онлайн. Правда заточен под MySql, но все равно интересно.