web-dev-qa-db-fra.com

Tri PostgreSQL par datetime asc, null first?

J'ai besoin de trier une table PostgreSQL par ordre croissant de date/heure, par ex. last_updated.

Mais ce champ est autorisé à être vide ou nul et je veux des enregistrements avec null dans last_updated come avant non null last_updated.
Est-ce possible?

order by last_updated asc /* and null last_updated records first ?? */
68
mhd

Postgres fournit le NULLS FIRST | LAST mots-clés pour le ORDER BY clause pour répondre exactement à ce besoin:

... ORDER BY last_updated NULLS FIRST

Un typique cas d'utilisation est avec un ordre de tri décroissant (DESC), ce qui donne l'inversion complète de l'ordre croissant par défaut (ASC) avec des valeurs nulles en premier. Souvent non souhaitable - donc, pour conserver les valeurs nulles en dernier:

... ORDER BY last_updated DESC NULLS LAST

Pour prendre en charge la requête avec un index , faites-le correspondre:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgres peut lire les index btree à l'envers, mais il importe où les valeurs NULL sont ajoutées.

135

Vous pouvez créer un ORDER BY personnalisé à l'aide d'une instruction CASE.
L'instruction CASE vérifie votre condition et attribue aux lignes qui remplissent cette condition une valeur inférieure à celle qui est affectée aux lignes qui ne remplissent pas la condition.
Il est probablement plus facile à comprendre étant donné un exemple:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;
8
bernie