Подтвердить что ты не робот

Пользовательский заказ в Oracle PL/SQL

У меня есть запрос оракула, в котором и я хочу, чтобы результат находился в пользовательском порядке "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')

Любые предложения

4b9b3361

Ответ 1

ORDER BY DECODE(
         GRADE_MASTER.GRADE_DESCRIPTION,
         'SENIOR DIRECTOR', 1,
         'DIRECTOR', 2,
         'MANAGER', 3,
         'EMPLOYEE', 4,
         5)

Ответ 2

Точка о 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)

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

Ответ 3

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

Ответ 4

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

ORDER BY GRADE_MASTER.GRADE_ORDER

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