Gérer les valeurs NULL dans une clause ORDER BY dans SQLite

Le par Anthony Domps.

Dans SQLite, les valeurs NULL sont considérées comme absentes et, par défaut, sont classées en premier lors d’un tri ascendant (ORDER BY ... ASC) et en dernier lors d’un tri descendant (ORDER BY ... DESC).

Considérons une table avec des valeurs NULL :

CREATE TABLE exemple (id INTEGER, valeur TEXT);
INSERT INTO exemple (id, valeur) VALUES (1, 'A'), (2, NULL), (3, 'B'), (4, NULL), (5, 'C');

La requête suivante :

SELECT * FROM exemple ORDER BY valeur ASC;

retourne les lignes où valeur est NULL en premier, ce qui peut être problématique selon les cas.

NULLS FIRST et NULLS LAST depuis SQLite 3.30

Depuis la version 3.30 sortie en octobre 2019, SQLite reconnaît et supporte officiellement la syntaxe SQL standard NULLS FIRST et NULLS LAST dans les clauses ORDER BY.

SELECT * FROM exemple ORDER BY valeur ASC NULLS LAST;

Cette syntaxe place explicitement les NULL à la fin du tri en ordre ascendant, sans nécessiter de contournements.

Solution alternative pour versions SQLite antérieures à 3.30

Pour garantir la compatibilité avec les versions plus anciennes, ou dans le cas où la syntaxe NULLS LAST ne serait pas prise en charge, la technique suivante permet de placer les NULL en dernier :

SELECT * FROM exemple
ORDER BY (valeur IS NULL), valeur ASC;

Cette expression trie d’abord selon que la valeur est NULL (1) ou non (0), plaçant ainsi les lignes non-nulles avant les NULL, puis trie par la colonne elle-même.

Conclusion

La gestion des valeurs NULL dans le tri SQL a été source de confusion avec SQLite. Grâce à la prise en charge officielle des clauses NULLS FIRST et NULLS LAST, il est désormais plus simple et plus clair de gérer l’ordre des valeurs NULL.

Astuce : vérifier la version SQLite

Pour savoir quelle version de SQLite est utilisée :

SELECT sqlite_version();

Assurez-vous d’utiliser au minimum la version 3.30 pour bénéficier de la prise en charge native de NULLS FIRST / NULLS LAST.