Im Gegensatz zu einigen anderen Datenbanken (wie Oracle) hat PostgreSQL einen voll funktionsfähigen boolean
Typ. Sie können es direkt verwenden in einem ORDER BY
-Klausel ohne Anwenden eines CASE
-Anweisung - diese eignen sich hervorragend für komplexere Situationen.
Sortierreihenfolge für boolean
Werte ist:
FALSE -> TRUE -> NULL
Wenn Sie ORDER BY bool_expression
DESC
, kehren Sie die Reihenfolge um:
NULL -> TRUE -> FALSE
Wenn Sie TRUE
wollen zuerst und NULL
zuletzt verwenden Sie NULLS LAST
Klausel von ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Natürlich NULLS LAST
ist nur relevant, wenn featured
oder created_at
kann sei NULL
. Wenn die Spalten definiert sind NOT NULL
, dann bemühe dich nicht.
Auch FALSE
vor NULL
sortiert werden . Wenn Sie nicht zwischen diesen beiden unterscheiden möchten, befinden Sie sich entweder wieder in einem CASE
-Anweisung, oder Sie können NULLIF()
einwerfen oder COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Leistung
Beachten Sie, wie ich verwendet habe:
created_at > now() - interval '11 days'
und nicht :
now() - created_at < interval '11 days'
Im ersten Beispiel ist der Ausdruck rechts eine Konstante, die einmal berechnet wird . Dann kann ein Index verwendet werden, um übereinstimmende Zeilen nachzuschlagen. Sehr effizient.
Letzteres kann normalerweise nicht mit einem Index verwendet werden. Für jede einzelne Zeile muss ein Wert berechnet werden, bevor er mit dem konstanten Ausdruck rechts verglichen werden kann. Tun Sie dies nicht, wenn Sie es vermeiden können. Immer!