Как указать динамический порядок по предложениям в Oracle - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть хранимая процедура Oracle, которая отвечает за нумерацию данных запроса. Он получает текст для поиска, смещение и номер страницы. Теперь я хочу добавить два новых параметра для сортировки результата запроса перед разбиением на страницы. У меня вопрос, как я могу указать динамический порядок и направление.

Сейчас я теперь должен использовать предложение CASE для указания столбца, но мне нужно добавить, если это ASC или DESC.

CREATE OR REPLACE PROCEDURE search_city_paged (
        in_search_key     IN                VARCHAR2,
        in_offset         IN                NUMBER,
        in_num_elements   IN                NUMBER,
        in_polling_place  IN                VARCHAR2,
        in_order_by       IN                NUMBER,
        in_order_dir      IN                VARCHAR2,
        out_city          OUT               SYS_REFCURSOR
    ) AS

BEGIN

    OPEN out_citizens FOR 
        SELECT COUNT(*) OVER (),
               cit.city_code,
               cit.city_name,
               cit.city_zip,
               cit.city_cities
        FROM city cit
        WHERE CATSEARCH(cit.FULL_TEXT_SEARCH, l_in_search_key, NULL)>0
        ORDER BY ???
        OFFSET in_offset ROWS FETCH FIRST in_num_elements ROWS ONLY;
END search_city_paged;

Если я получу в новых параметрах 1 и ASC, результат будет отсортирован по ASC города. Если я получу в новых параметрах 1 и DESC, результат сортируется по коду города_C DESC. Если я получу в новых параметрах 2 и ASC, результат сортируется по названию города ASC. Если я получу в новых параметрах 2 и DESC, результат сортируется по названию города DESC.

И ... таким же образом в каждом столбце, что я должен разрешить сортировку результатов.

1 Ответ

2 голосов
/ 05 апреля 2019

Порядок по двум внешним 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, и сортировка по нему не повлияет на порядок.

...