Спрятать колонку

Oracle. Динамическая сортировка

небольшой хинт для использования сортировок.

задачка: предположим есть нам нужно сортировать данные и порядок сортировки указан в другой таблице. 1 - asc, 2 - desc. нужно написать запрос.

создадим таблицы и внесем в них данные:

CREATE TABLE master (
 id NUMBER, -- ключ для связки
 order_by NUMBER(1) -- указан порядок сортировки для дочерней таблицы 1 -> ASC, 2 -> DESC
); 
 
CREATE TABLE detail (
 id NUMBER, -- ключ для связки
 val NUMBER -- значение
); 
 
INSERT INTO master(id, order_by)
VALUES(1, 1);
INSERT INTO master(id, order_by)
VALUES(2, 2);
 
INSERT INTO detail(id, val)
VALUES(1, 2);
INSERT INTO detail(id, val)
VALUES(1, 1);
INSERT INTO detail(id, val)
VALUES(1, 4);
INSERT INTO detail(id, val)
VALUES(1, 3);
INSERT INTO detail(id, val)
VALUES(1, 5);
 
INSERT INTO detail(id, val)
VALUES(2, 2);
INSERT INTO detail(id, val)
VALUES(2, 1);
INSERT INTO detail(id, val)
VALUES(2, 4);
INSERT INTO detail(id, val)
VALUES(2, 3);
INSERT INTO detail(id, val)
VALUES(2, 5);
COMMIT;

запрос:

SELECT DETAIL.*
FROM MASTER, DETAIL
WHERE MASTER.ID = DETAIL.ID
ORDER BY DETAIL.ID, 
CASE MASTER.ORDER_BY
    WHEN 1 THEN DETAIL.VAL 
    ELSE 1
END ASC,
CASE MASTER. ORDER_BY
    WHEN 2 THEN DETAIL.VAL
    ELSE 1 
END DESC

здесь использована возможность участия в формировании условия ORDER BY оператором CASE.
первое условие задает сортировку по группе в целом.
второе условие проверяет указана ли сортировка по возрастанию, иначе возвращается 1, т.е ничего не делается.
третье условие проверяет указана ли сортировка по убыванию, иначе возвращается 1, т.е ничего не делается.

как видно, ничего сложного нет. условия можно комбинировать, добавлять и удалять поля и так далее.
матчасть спасет нас Smile

ну и напоследок:

DROP TABLE DETAIL;
DROP TABLE MASTER;

RSS-материал

Наверх