[英]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.