Индивидуальный заказ в Oracle PL / SQL - PullRequest
14 голосов
/ 11 мая 2010

У меня есть оракульный запрос, в котором я хочу, чтобы результат был в произвольном порядке: «Старший директор», «Директор», «Менеджер», «Сотрудник» из поля 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')

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

Ответы [ 4 ]

28 голосов
/ 11 мая 2010
ORDER BY DECODE(
         GRADE_MASTER.GRADE_DESCRIPTION,
         'SENIOR DIRECTOR', 1,
         'DIRECTOR', 2,
         'MANAGER', 3,
         'EMPLOYEE', 4,
         5)
10 голосов
/ 11 мая 2010

Суть около decode() заключается в том, что для каждой пары значений она заменяет второе значение первым. Таким образом, ваш опубликованный запрос сортирует «SENIOR DIRECTOR» в качестве «DIRECTOR», «MANAGER» в качестве «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 голосов
/ 13 мая 2010

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

2 голосов
/ 11 мая 2010

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

ORDER BY GRADE_MASTER.GRADE_ORDER

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

...