Я сделал, чтобы оракул запросил, в котором и я хочу, чтобы результатом был в пользовательском порядке 'СТАРШИЙ УПРАВЛЯЮЩИЙ', 'ДИРЕКТОР', 'МЕНЕДЖЕР', 'СОТРУДНИК', который является от поля 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)
Вы можете добавить новый столбец в GRADE_MASTER
для представления порядка или уровней. Это позволит вам изменить порядок в предложении на:
ORDER BY GRADE_MASTER.GRADE_ORDER
И имеет то преимущество, что требует изменений только в таблице GRADE_MASTER
, когда вводится новая оценка.
Суть decode ()
заключается в том, что для каждой пары значений он заменяет второе значение на первое. . Таким образом, ваш опубликованный запрос сортирует «СТАРШИЙ ДИРЕКТОР» как «ДИРЕКТОР», «МЕНЕДЖЕР» как «СОТРУДНИК», а все остальные после этого случайным образом.
Итак, что вам нужно сделать, так это присвоить каждому значению порядок сортировки. Самый надежный способ справиться с этим - назначить столбец 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.