Порядок по двум внешним CASE
выражениям, одно ASC
, одно DESC
.В первом случае проверьте, хотите ли вы отсортировать ASC
, а если нет, пусть выражение возвращает константу или NULL
, то есть оно не меняет порядок.Для случая, когда вы хотите отсортировать ASC
, добавьте внутреннее выражение CASE
, которое возвращает столбец для сортировки.Аналогично обработайте случай DESC
.
...
ORDER BY CASE
WHEN in_order_dir = 'ASC' THEN
CASE
WHEN in_order_by = 1 THEN
city_code
WHEN in_order_by = 2 THEN
city_name
...
END
END ASC,
CASE
WHEN in_order_dir = 'DESC' THEN
CASE
WHEN in_order_by = 1 THEN
city_code
WHEN in_order_by = 2 THEN
city_name
...
END
END DESC;
Возможно, вам придется адаптировать его из-за несовместимости типов между столбцами, я не могу сказать это по тому, что вы опубликовали.Но это должно передать общую концепцию.
Редактировать:
По проблеме типа:
Одна из возможностей - преобразовать столбцы в совместимые типы данных таким образомпорядок сохраняется.Например, если у вас есть char_column
(типа char
), date_column
и integer_column
(date
и integer
), вы можете сделать
to_char(date_column, 'YYYYMMDDHH24MISS')
для преобразования даты и
lpad(11, 38, '0')
для преобразования целого числа в char
.
Более чистая вещь, которую нужно сделать, но та, которая требует больше работы (для программиста в терминахпроизводительности не должно быть существенной разницы) разделить выражения еще раз.Т.е. есть внешний CASE
для каждого типа, в котором столбцы указаны для каждого направления.
Как
ORDER BY CASE
WHEN in_order_dir = 'ASC' THEN
CASE
WHEN in_order_by = 1 THEN
char_column1
WHEN in_order_by = 2 THEN
char_column2
...
END
END ASC,
CASE
WHEN in_order_dir = 'ASC' THEN
CASE
WHEN in_order_by = 3 THEN
date_column1
WHEN in_order_by = 4 THEN
date_column2
...
END
END ASC,
и т. Д. Для всех типов и аналогично для DESC
.Помните, что если столбец не предназначен для сортировки после таких CASE
, то будет получено NULL
, и сортировка по нему не повлияет на порядок.