簡體   English   中英

Oracle PL / SQL中的自定義順序

[英]Custom order in Oracle PL/SQL

我有一個oracle查詢,其中我希望結果是自定義順序'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')

有什么建議么??

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

關於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)

為了以防萬一,最好包含一個默認值。 我還想在排序編號中留下大的空白,以便更容易插入新值。

您應該使用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模式之間切換。

您可以向GRADE_MASTER添加新列以表示訂單或級別。 這將允許您將order by子句更改為:

ORDER BY GRADE_MASTER.GRADE_ORDER

並且具有以下優點:在引入新等級時僅需要更改GRADE_MASTER表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM