PostgreSQL - 条件排序

时间:2017-04-10 11:31:44

标签: sql postgresql sorting sql-order-by

我有下表:

key | date         | flag
--------------------------
1    now()           true
2    now() - 1 hour  true
3    now() + 1 hour  true
4    now()           false
5    now() - 1 hour  false
6    now() + 1 hour  false

我想要进行以下排序:

  • 首先,所有行都有flag = false。必须使用date asc对这些行进行排序。
  • 然后,所有其他行(flag = true)。但是,这些行必须使用date desc进行排序。

以下查询是否正确?

(
    select *
    from test
    where flag = false
    order by date asc
)
union all
(
    select *
    from test
    where flag = true
    order by date desc
)

有更好的方法吗? union all是否会对行进行排序,因此只会连接两个内部查询的输出?

我不知道如何根据条件重复order by中的列。

更新

可以在这里找到小提琴:http://rextester.com/FFOSS79584

1 个答案:

答案 0 :(得分:9)

可以使用CASE执行条件订单,例如:

select *
    from test
order by 
    flag
  , case when flag then date end desc
  , case when not flag then date end asc