繁体   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