我有一个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')
任何建议??
答案 0 :(得分:28)
ORDER BY DECODE(
GRADE_MASTER.GRADE_DESCRIPTION,
'SENIOR DIRECTOR', 1,
'DIRECTOR', 2,
'MANAGER', 3,
'EMPLOYEE', 4,
5)
答案 1 :(得分:10)
关于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)
最好包含一个默认值,以防万一。我还想在排序编号中留下很大的空白,以便更容易插入新值。
答案 2 :(得分:3)
您应该使用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模式之间切换。
答案 3 :(得分:2)
您可以向GRADE_MASTER
添加新列以表示订单或级别。这将允许您将order by子句更改为:
ORDER BY GRADE_MASTER.GRADE_ORDER
并且具有以下优点:在引入新成绩时,只需要更改GRADE_MASTER
表。