2017-09-14 24 views
2

start_at(日付)end_at(日付)pauzed_at(日付)などプロジェクトを持つプロジェクトテーブルが1つあります。日付値に基づいてプロジェクトを注文したいと思います。postgres複数の日付の値に基づいて並べ替え

ソートする必要があります。日付がstart_at & end_atの間にあるとき

- STARTED projects 
- PAUZED projects 
- IDLE projects 
- ENDED projects 

プロジェクトが開始されます。

start_atの日付に達していない場合、プロジェクトはアイドル状態です。

end_atの日付に達するとプロジェクトが終了します。

paused_atが設定されている場合、プロジェクトが一時停止されているなどなど

どのように私は、プロジェクトの状態に基づいて、このテーブルを並べ替えることができますか?

答えて

1

状態がcase式で表すことができる。

SELECT * 
FROM projects 
ORDER BY CASE WHEN paused_at IS NOT NULL THEN 2 -- paused 
       WHEN ended_at() < NOW() THEN 4 -- ended 
       WHEN started_at() > NOW() THEN 3 -- idle 
       ELSE 1 -- started 
     END ASC 
1

false注文true前:

order by 
    now() >= start_at and now() < end_at desc, 
    paused_at is null, 
    now() < start_at desc, 
    now() >= end_at desc 

case発現は、プランナに最適化障壁です。