2010-05-11 24 views
12

Sonuçta özel bir siparişin olmasını istiyorum ve sonuçların GRADE_DESCRIPTON alanından gelen 'SENIOR DIRECTOR', 'DIRECTOR', 'MANAGER', 'EMPLOYEE'. Aşağıdaki sorguyu kullanıyorum.Oracle PL/SQL'de özel sipariş

Ancak, 'ÜST DİREKTÖRÜ', 'YÖNETİCİSİ' dir alma sonucu im sırası 'ÇALIŞAN'

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

Herhangi Öneriler MÜDÜRÜ istenilen sonucu almıyorum ??

cevap

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

Sen sipariş veya seviyelerini temsil etmek GRADE_MASTER yeni bir sütun ekleyebilir. Bu işlemin ardından, fıkra tarafından sırasını değiştirmek için izin verecek:

ORDER BY GRADE_MASTER.GRADE_ORDER 

Ve yeni sınıf tanıtıldı yalnızca GRADE_MASTER tabloya değişiklikleri gerektiren bir avantaja sahiptir.

10

decode() ile ilgili nokta, her bir değer çifti için ilk için ikinci değeri değiştirmesidir. Bu nedenle, gönderdiğiniz sorgularınız 'YÖNETMEN DİREKTÖRÜ' olarak 'YÖNETMEN', 'YÖNETİCİ' olarak 'ÇALIŞAN' ve herkesten rasgele olarak sıralanır.

Yapmanız gereken şey, her bir değere bir sıralama düzeni atamaktır. Bunu işlemenin en geleceğe yönelik yolu, GRADE_DESCRIPTION tablosuna bir SORT_ORDER sütunu atamak olacaktır, ancak bu her zaman pratik değildir.

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) 

varsayılan bir değer eklemek iyi bir fikirdir: Yani sadece bu şekilde sıralanabilir gereken bir veya iki rapor varsa o zaman sadece sabit kodlanmış açıklamaları devam edebilir (muhtemel görünüyor) , her ihtimale karşı. Ayrıca yeni bir değere girmeyi kolaylaştırmak için sıralama numaralarında büyük boşluklar bırakmak istiyorum.

3

Bir PL/SQL DECODE yerine bir SQL ÖRNEĞİ kullanmalısınız:

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 

Bu SQL ve PL/SQL modları arasında geçiş yapmasını ayrıştırıcı tutacaktır.

+1

Fnord. 'decode()' bir SQL işlevidir ve her zaman olmuştur. Aslında, 'case()' in aksine, PL/SQL'de (gömülü bir SQL ifadesinin parçası dışında) kullanılamaz. – APC