Thread: Re: Динамический набор выражений в "order by"

Re: Динамический набор выражений в "order by"

From
Заяц Алексей
Date:
Привет, Сергей.

select id from  topic order by  ( case when 1=2 then title else name end );

в таком варианту нужно чтобы выражения внутри case были одно типа.

Sergey Konoplev пишет:
> Привет,
>
> Есть процедура, принимающая какие-то аргументы. Аргументы должны
> влиять на набор выражений "order by" одного из запросов. Например: в
> одном случае сортировка по полям 1, 2 (desc) и 3, а в другом по 3, 1 и
> 2, а в третьем только по 2 и 3.
>
> Есть ли решение позволяющее сделать это без использования
> динамического SQL или дублирования кода?
>
С уважением,
Алексей Заяц.

Re: Динамический набор выражений в "order by"

From
"Sergey Konoplev"
Date:
> select id from  topic order by  ( case when 1=2 then title else name end );

Привет, да, я тоже об этом думал :) Собственно вот к чему пришел:

Если бы все поля по которым надо сортировать были одного типа (напр.
float8) то всё было бы легче.

select *  from (
   values
       (1.27, 23.46, 56.2, 76.1),
       (4.35, 6.76, 45.3, 1.6)
) as sq
order by
   case
       when false then array[-column1, column3]
       when true  then array[column1]
       else array[column2, -column4, column1]
   end

Заметь, что я использую вместо "desc" знак минуса. Т.о. надо написать
функцию сопоставления любого типа к float8, т.е. некий аналог
хэш-функции и будет всем счастье. Я накопал в исходниках PG функцию
convert_to_scalar(), которая именно это и делает, сейчас веду
дискуссию в pgsql-general. Как что-нить решится отпишусь.

--
Regards,
Sergey Konoplev