Ответ 1
ORDER BY DECODE(
GRADE_MASTER.GRADE_DESCRIPTION,
'SENIOR DIRECTOR', 1,
'DIRECTOR', 2,
'MANAGER', 3,
'EMPLOYEE', 4,
5)
У меня есть запрос оракула, в котором и я хочу, чтобы результат находился в пользовательском порядке "SENIOR DIRECTOR", "DIRECTOR", "MANAGER", "EMPLOYEE", который находится из поля GRADE_DESCRIPTON. Я использую следующий запрос.
Однако я не получаю желаемого результата Порядок получения результата - "СТАРШИЙ ДИРЕКТОР", "МЕНЕДЖЕР", ДИРЕКТОР, "РАБОТНИК"
SELECT DISTINCT GRADE_DESCRIPTION
, HIRING_FORECATS.*
FROM GRADE_MASTER left join HIRING_FORECATS
ON (HIRING_FORECATS.GRADE = GRADE_MASTER.GRADE_DESCRIPTION
and HIRING_FORECATS.LOCATION = 'HO' )
order by decode
(GRADE_MASTER.GRADE_DESCRIPTION, 'SENIOR DIRECTOR', 'DIRECTOR', 'MANAGER', 'EMPLOYEE')
Любые предложения
ORDER BY DECODE(
GRADE_MASTER.GRADE_DESCRIPTION,
'SENIOR DIRECTOR', 1,
'DIRECTOR', 2,
'MANAGER', 3,
'EMPLOYEE', 4,
5)
Точка о decode()
заключается в том, что для каждой пары значений она заменяет второе значение для первого. Таким образом, ваш опубликованный запрос сортирует "SENIOR DIRECTOR" как "ДИРЕКТОР", "МЕНЕДЖЕР" как "EMPLOYEE" и все остальные случайно после этого.
Итак, вам нужно назначить порядок сортировки для каждого значения. Самым надежным способом решения этой проблемы было бы присвоить столбец SORT_ORDER таблице GRADE_DESCRIPTION, но это не всегда практично. Поэтому, если у вас есть только один или два отчета, которые нужно отсортировать таким образом (кажется вероятным), вы можете просто продолжить жестко кодированные описания:
SELECT DISTINCT GRADE_DESCRIPTION
, HIRING_FORECATS.*
FROM GRADE_MASTER left join HIRING_FORECATS
ON (HIRING_FORECATS.GRADE = GRADE_MASTER.GRADE_DESCRIPTION
and HIRING_FORECATS.LOCATION = 'HO' )
order by decode
(GRADE_MASTER.GRADE_DESCRIPTION
, 'SENIOR DIRECTOR', 10
, 'DIRECTOR', 20
, 'MANAGER', 30
, 'EMPLOYEE', 40
, 100)
Рекомендуется включить значение по умолчанию на всякий случай. Я также хотел бы оставить большие пробелы в номерах сортировки, чтобы упростить слот в новом значении.
Вы должны использовать SQL CASE вместо PL/SQL DECODE:
order by CASE WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'SENIOR DIRECTOR' THEN 1
WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'DIRECTOR' THEN 2
WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'MANAGER' THEN 3
WHEN GRADE_MASTER.GRADE_DESCRIPTION = 'EMPLOYEE' THEN 4
ELSE 5
END
Это заставит синтаксический анализатор переключаться между режимами SQL и PL/SQL.
Вы можете добавить новый столбец в GRADE_MASTER
, чтобы представить порядок или уровни. Это позволит вам изменить порядок order by на:
ORDER BY GRADE_MASTER.GRADE_ORDER
И имеет то преимущество, что требуется только изменение таблицы GRADE_MASTER
при введении нового класса.