【问题标题】:Custom order in Oracle PL/SQLOracle PL/SQL 中的自定义顺序
【发布时间】:2018-07-05 15:10:35
【问题描述】:

我有一个 oracle 查询,我希望结果是自定义顺序“高级总监”、“董事”、“经理”、“员工”,它来自 GRADE_DESCRIPTON 字段。我正在使用以下查询。

但是我没有得到想要的结果 我得到的结果顺序是'SENIOR DIRECTOR','MANAGER', DIRECTOR,'EMPLOYEE'

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

有什么建议吗??

【问题讨论】:

    标签: sql oracle sql-order-by


    【解决方案1】:
    ORDER BY DECODE(
             GRADE_MASTER.GRADE_DESCRIPTION,
             'SENIOR DIRECTOR', 1,
             'DIRECTOR', 2,
             'MANAGER', 3,
             'EMPLOYEE', 4,
             5)
    

    【讨论】:

      【解决方案2】:

      关于decode() 的要点是,对于每对值,它将第二个值替换为第一个值。因此,您发布的查询将“高级总监”排序为“董事”,将“经理”排序为“员工”,然后随机排序。

      因此,您需要为每个值分配一个排序顺序。处理此问题的最面向未来的方法是将 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)
      

      最好包含一个默认值,以防万一。我还喜欢在排序号中留出较大的间隔,以便更容易插入新值。

      【讨论】:

        【解决方案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 模式之间切换。

        【讨论】:

        • 弗诺德。 'decode()' 是一个 SQL 函数,并且一直都是。事实上,与case() 不同的是,它不能在 PL/SQL 中使用(除了作为嵌入式 SQL 语句的一部分)。
        【解决方案4】:

        您可以向GRADE_MASTER 添加一个新列来表示排序或级别。这将允许您将 order by 子句更改为:

        ORDER BY GRADE_MASTER.GRADE_ORDER
        

        并且具有在引入新等级时只需要更改GRADE_MASTER 表的优点。

        【讨论】:

          猜你喜欢
          • 2012-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-26
          • 2021-07-25
          • 2011-08-26
          相关资源
          最近更新 更多