2017-04-10 3 views
1

Ich habe die folgende Tabelle:PostgreSQL - bedingte Bestellung

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 

ich die folgenden Sortier will:

  • Zuerst wird alle Zeilen mit flag = false. Diese Zeilen müssen mit date asc sortiert werden.
  • Dann alle anderen Zeilen (flag = true). Diese Zeilen müssen jedoch mit date desc sortiert werden.

Ist die folgende Abfrage korrekt?

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

Gibt es einen besseren Weg, dies zu tun? Wird die union all die Zeilen sortiert halten und daher nur die Ausgabe der beiden inneren Abfragen verketten?

Ich kann nicht die Spalten in order by, basierend auf einer Bedingung wiederholen.

Update

Fiddle finden Sie hier: http://rextester.com/FFOSS79584

+0

bedingte Bestellung mit 'CASE' –

+0

smth erfolgt wie 'order by flag, fall wenn flag dann date end desc, fall wenn nicht flag dann date asset asc' http://rextester.com/FDAY76293 –

Antwort

2

bedingte Bestellung kann mit CASE, wie hier durchgeführt werden:

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