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 ?? */
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.
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;