2010-05-13 8 views
12

Meine Tabelle hat drei boolesche Felder: f1, f2, f3. Wenn ichSQL zum Sortieren boolescher Spalten als wahr, null, falsch

SELECT * FROM table ORDER BY f1, f2, f3 

die Aufzeichnungen tun wird durch diese Felder in der Reihenfolge false, true, null sortiert werden. Ich möchte sie mit null zwischen wahr und falsch anordnen: die richtige Reihenfolge sollte wahr sein, null, falsch.

Ich benutze PostgreSQL.

Antwort

19

Nicht schön, aber sollte funktionieren:

... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc 
+2

Offensichtlich müssten Sie das gleiche für jede der anderen Variablen tun. –

+11

+1. Machen wir es hässlicher: 'ORDER BY COALESCE ((NICHT bool_field) :: INTEGER * 2, 1)'. :) – pilcrow

+0

FEHLER: Funktion isnull (boolean) existiert nicht – petehern

14

Eine bessere Lösung

f1 DESC NULLS LAST

zu verwenden wäre, wenn Sie mit dem Auftrag wahr, falsch, nichts in Ordnung sind (ich denke, der wichtige Teil Ihrer Frage war, wie in meiner gegenwärtigen Situation, die nicht-wahren vaules zusammen zu haben)

https://stackoverflow.com/a/7621232/1627888

+0

Während dies nützlich ist, beantwortet es nicht die Frage, da es Fälle gibt, wo Sie wirklich wollen 'null' zwischen' true' und 'false'. – oulenz

2

Sie könnte auch wie folgt vorgehen:

order by coalesce(f1, FALSE), coalesce(f1, TRUE), ... 

Wenn f1TRUE ist, erhalten Sie: TRUE, TRUE
Wenn f1NULL ist, erhalten Sie: FALSE, TRUE
Wenn f1FALSE ist, erhalten Sie: FALSE, FALSE

entspricht der gewünschten Sortierreihenfolge.

Verwandte Themen