Пользовательский порядок в МН Oracle / SQL

Я сделал, чтобы оракул запросил, в котором и я хочу, чтобы результатом был в пользовательском порядке 'СТАРШИЙ УПРАВЛЯЮЩИЙ', 'ДИРЕКТОР', 'МЕНЕДЖЕР', 'СОТРУДНИК', который является от поля 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')

Какие-либо предложения??

14
задан a_horse_with_no_name 5 July 2018 в 07:10
поделиться

4 ответа

ORDER BY DECODE(
         GRADE_MASTER.GRADE_DESCRIPTION,
         'SENIOR DIRECTOR', 1,
         'DIRECTOR', 2,
         'MANAGER', 3,
         'EMPLOYEE', 4,
         5)
28
ответ дан 1 December 2019 в 06:43
поделиться

Вы можете добавить новый столбец в GRADE_MASTER для представления порядка или уровней. Это позволит вам изменить порядок в предложении на:

ORDER BY GRADE_MASTER.GRADE_ORDER

И имеет то преимущество, что требует изменений только в таблице GRADE_MASTER , когда вводится новая оценка.

2
ответ дан 1 December 2019 в 06:43
поделиться

Суть 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)

На всякий случай рекомендуется включить значение по умолчанию. . Я также люблю оставлять большие пробелы в числах сортировки, чтобы было легче вставить новое значение.

10
ответ дан 1 December 2019 в 06:43
поделиться

Вы должны использовать 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.

3
ответ дан 1 December 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: