Contrairement à certaines autres bases de données (comme Oracle), PostgreSQL a un boolean
entièrement fonctionnel taper. Vous pouvez l'utiliser directement dans un ORDER BY
clause sans appliquer de CASE
énoncé - ils sont parfaits pour les situations plus complexes.
Ordre de tri pour boolean
valeurs est :
FALSE -> TRUE -> NULL
Si vous ORDER BY bool_expression
DESC
, vous inversez l'ordre :
NULL -> TRUE -> FALSE
Si vous voulez TRUE
premier et NULL
enfin, utilisez le NULLS LAST
clause de ORDER BY
:
ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST
, created_at DESC
Bien sûr, NULLS LAST
n'est pertinent que si featured
ou created_at
peut être NULL
. Si les colonnes sont définies NOT NULL
, alors ne vous embêtez pas.
Aussi, FALSE
serait trié avant NULL
. Si vous ne voulez pas faire la distinction entre ces deux, vous êtes soit de retour à un CASE
déclaration, ou vous pouvez ajouter NULLIF()
ou COALESCE()
.
ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'), FALSE)
DESC NULLS LAST
, created_at DESC
Performances
Remarque, comment j'ai utilisé :
created_at > now() - interval '11 days'
et pas :
now() - created_at < interval '11 days'
Dans le premier exemple, l'expression à droite est une constante qui est calculée une fois . Ensuite, un index peut être utilisé pour rechercher les lignes correspondantes. Très efficace.
Ce dernier ne peut généralement pas être utilisé avec un index. Une valeur doit être calculée pour chaque ligne, avant de pouvoir être vérifiée par rapport à l'expression constante à droite. Ne le faites pas si vous pouvez l'éviter. Jamais !