使用多列的Oracle自定义排序

时间:2018-03-16 21:20:41

标签: sql oracle

表:

contig_21128    bcsZ    A1
contig_3712     bcsZ    A1
contig_38480    bcsZ    A2
contig_62779    bcsZ    A2
contig_115486   bcsZ    A4
contig_14345    bcsZ    A4
contig_19362    bcsZ    A5
contig_53656    bcsZ    A5
contig_100190   bcsZ    A6
contig_23343    bcsZ    A6

我需要使用状态,已关闭和目标日期对其进行排序。像首先打开的项目然后关闭的东西,如果它是使用target_date打开升序并关闭然后使用closed_date。 我使用这个解码函数将所有打开的第一个打开,然后关闭,但不知道如何在这个条件下添加日期列。

id Status Closed_date target_date 
1  Open               03/20/2018
2  Closed 03/14/2018
3  closed 03/12/2018 
4  Open               04/20/2018

1 个答案:

答案 0 :(得分:1)

你可以这样做:

order by status desc, target_date, closed_date

order by status desc, coalesce(target_date, closed_date)

这使用" open"并且"关闭"具有特定的顺序,并且日期值是针对一个或另一个。更明确的方法是:

order by (case when status = 'open' then 1 else 2 end),
         coalesce(target_date, closed_date)

或者,更明确的方法:

order by (case when status = 'open' then 1 else 2 end),
         (case when status = 'open' then target_date end),
         (case when status = 'closed' then closed_date end)

我认为前两种方法中的一种在意图上足够明确。