2010-05-11 10 views
12

Mam zapytanie o wyrocznię, w którym i chcę, aby wynik był w niestandardowej kolejności "SENIOR DIRECTOR", "DYREKTOR", "MANAGER", "PRACOWNIK", który jest z pola GRADE_DESCRIPTON. Używam poniższego zapytania.Niestandardowe zamówienie w Oracle PL/SQL

Jednak ja nie otrzymuję pożądanego rezultatu Kolejność rezultacie im coraz to „dyrektor”, „zarządca”, reżyser, „pracownika”

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') 

jakieś sugestie ??

Odpowiedz

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

Możesz dodać nową kolumnę do GRADE_MASTER, aby reprezentować porządek lub poziomy. Pozwoliłoby to na zmianę kolejności przez klauzuli:

ORDER BY GRADE_MASTER.GRADE_ORDER 

i ma tę zaletę, że tylko wymagające zmian w tabeli GRADE_MASTER gdy wprowadzany jest nowy gatunek.

10

Punkt o numerze decode() polega na tym, że dla każdej pary wartości zastępuje ona drugą wartość dla pierwszej pary. Tak więc twoje zaksięgowane zapytanie sortuje "SENIOR DIRECTOR" jako "DYREKTOR", "MANAGER" jako "PRACOWNIK", a wszyscy inni losowo po tym.

Musisz więc przypisać kolejność sortowania do każdej wartości. Najbardziej przyszłościowym sposobem obsługi byłoby przypisanie kolumny SORT_ORDER do tabeli GRADE_DESCRIPTION, ale nie zawsze jest to praktyczne. Więc jeśli masz tylko jeden lub dwa raporty, które muszą być posortowane w ten sposób (wydaje się prawdopodobne), to można po prostu kontynuować z zakodowane opisów:

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) 

To jest dobry pomysł, aby to wartość domyślna , w razie czego. Lubię również zostawiać duże rozbieżności w numerach, aby łatwiej było znaleźć nową wartość.

3

Należy użyć SQL CASE zamiast 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 

ta będzie na bieżąco z parsera przełączania pomiędzy trybami SQL i PL/SQL.

+1

Fnord. 'decode()' jest funkcją SQL i zawsze była. W rzeczywistości w przeciwieństwie do 'case()' nie można go używać w PL/SQL (z wyjątkiem jako części wbudowanej instrukcji SQL). – APC

Powiązane problemy