Если я вас правильно понимаю, вы спрашиваете, можно ли динамически изменять весь список ORDER BY на основе связанного параметра, включая варианты ASC / DESC и т. Д.
Лучше всего выполнять разные запросы с разными ORDER BY, в зависимости от того, как вы хотите сортировать. Это намного проще и будет работать быстрее.
Если вы действительно хотите сделать это так, как вы просите, вы можете сделать это в определенной степени, используя ту же технику, которую вы уже используете с ORDER BY DECODE (choice1, expression1, choice2, expression2, ...) за исключением того, что выражения должны были бы быть намного более сложными. Каждое выражение должно было бы создать объединенную строку полей фиксированного размера в порядке приоритета сортировки, например:
ORDER BY DECODE('description', UPPER(SUBSTR(group_description, 1, 1))
|| SUBSTR(group_description, 1, 1)
|| RPAD(UPPER(group_description),40)
|| RPAD(group_description_key,10)
,'name', UPPER(SUBSTR(group_name, 1, 1)),
|| LPAD(1000-ASCII(group_name)), -- first char DESC
|| RPAD(UPPER(group_name),20)
|| RPAD(group_name_key,10)
Также было бы сложно смешивать поля ASC и DESC. Вы можете переключать направление для числовых полей, используя что-то вроде LPAD (1000000 - n, 7), где 1000000 - это число больше любого возможного n. Вы также можете сыграть некоторые другие трюки, как я делал в моем примере с первым символом group_name.
Этот метод не позволит базе данных использовать индексы для ускорения упорядочения (если вы не добавите несколько сумасшедших индексов на основе функций).
Опять же, я рекомендую вам отказаться от этого подхода и просто отправить в базу совершенно другой запрос в зависимости от вашего желаемого предложения ORDER BY. Если вы используете PL / SQL, вы также можете использовать динамический SQL для построения запроса с нужным предложением ORDER BY и его выполнения.
РЕДАКТИРОВАТЬ: Мой PL / SQL немного ржавый, но вот как вы можете сделать это в PL / SQL с динамическим SQL.
FUNCTION QueryGroups(sort_key in varchar2) RETURN REF CURSOR
IS
sql_block VARCHAR2(2000);
order_by VARCHAR2(2000);
ret REF CURSOR;
BEGIN
order_by :=
CASE sort_key
WHEN 'name'
THEN q'{UPPER(SUBSTR(group_name, 1, 1)),
SUBSTR(group_name, 1, 1) DESC,
UPPER(group_name),
group_name DESC,
group_name_key}';
WHEN 'description'
THEN q'{UPPER(SUBSTR(group_description, 1, 1)),
SUBSTR(group_description, 1, 1) DESC,
UPPER(group_description),
group_description DESC,
group_description_key}';
END CASE;
sql_block = q'{SELECT *
FROM (SELECT distinct gl.group_id,
gl.group_name,
gl.group_description,
gl.status_code,
gl.member_count,
(SELECT grpp.group_name
FROM test_group_relationship grel JOIN test_group grpp
ON grel.parent_group_id = grpp.group_id
WHERE grel.child_group_id = gl.group_id
) AS parent_group_name,
gl.group_name_key,
gl.group_description_key
FROM test_group AS gl
WHERE gl.group_org_id = '3909'
AND (gl.group_name_key LIKE '%GROUP%')
) AS data_set }' || order_by;
OPEN ret for sql_block;
return ret;
END QueryGroups;