我需要做一个Custom Oracle Sort

jjo*_*150 3 sql oracle sql-order-by

如果这是一个简单的问题,我很抱歉.但是,我在大约一个小时内搜索了高低的答案.

我有一个db_table,我需要对输出到网页中的表进行排序.数据以下列方式存储在db_table中:

   date          Area         Value
   ------        ------      -------
 11-mar-18        middle        10
 11-mar-18        bottom         5
 11-mar-18        top           12

 12-mar-18        top           14
 12-mar-18        bottom         4
 12-mar-18        middle        17
Run Code Online (Sandbox Code Playgroud)

问题是:我如何对它们进行排序以产生以下结果:

    date          Area         Value
   ------        ------      -------
 11-mar-18        top           12 
 11-mar-18        middle        10
 11-mar-18        bottom         5 

 12-mar-18        top           14
 12-mar-18        middle        17
 12-mar-18        bottom         4
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

Bar*_*han 6

排序区域按字母顺序降序为订单的第二个组成部分:

select *
  from db_table
 order by "date", area desc;
Run Code Online (Sandbox Code Playgroud)

正如你所提到的,如果area有值A,B,C,D,并且他们希望按C,B,D,A的顺序排序,那么使用:

select *
  from db_table
 order by "date", decode(area,'C',1,'B',2,'D',3,'A',4);
Run Code Online (Sandbox Code Playgroud)

特别是PS,我把日期列放在引号内,因为已经创建了带有"date"列的表,而不是date作为关键字的不可能.

  • 最好在所有情况下使用`decode`(或`case`),而不是利用TOP,MIDDLE和BOTTOM恰好按照反向词典顺序排列的事故.有一天他们将改为FIRST,MIDDLE,LAST,查询将不再提供正确的订单.如果他们做过类似的事情,最好强迫他们对`ORDER BY`进行必要的修改. (2认同)

kc2*_*018 5

select *
  from db_table
 order by "date", 
    case 
       when area = 'top' then 1 
       when area = 'middle' then 2
       when area = 'bottom' then 3
       else 4
    end;
Run Code Online (Sandbox Code Playgroud)

请参阅自定义排序顺序