PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Priorité basée sur le temps dans la requête d'enregistrement actif

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 !