PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zeitbasierte Priorität in Active Record Query

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!