J’écris cette petite astuce du jour pour décrire le comportement lorsque vous ordonnez le résultat d’une requête et que des valeurs nulles existent sur une colonne cible.
Le cas d’utilisation
Disons que nous avons une table entities
avec une colonne created_at
et une autre nommée in_progress_at
.
La première colonne ne vaut jamais null
alors que la seconde peut-être égale à null
jusqu’à ce qu’on mette à jour l’enregistrement.
Maintenant, la logique métier veut classer les enregistrements par ordre décroissant, en commençant par les derniers enregistrements mis à jour et en terminant par les autres.
Si vous ordonnez par ordre décroissant sur in_progress_at
d’abord et ensuite sur created_at
également par ordre décroissant, que se passera-t-il si vous avez un enregistrement sans in_progress_at
défini et un autre sans valeur sur in_progress_at
?
Tout simplement, l’enregistrement dont la valeur de in_progress_at
est nulle sera listée en premier.
Et si vous ajoutez un nouvel enregistrement et mettez à jour un enregistrement existant ? Eh bien, le nouvel enregistrement restera en tête…
Qu’en est-il de l’ordre croissant ? C’est l’inverse : l’enregistrement avec une valeur nulle arrive en deuxième position.
Tester avec l’éditeur SQL de Supabase
C’est simple :
- Créez un [compte Supabase] (https://supabase.com/) et un projet.
- Créer une table
entities
avec les deux colonnes de dates décrites ci-dessus. - Insérer quelques enregistrements.
- Naviguer sur l’éditeur SQL pour tester les requêtes suivantes :
|
|
La requête ci-dessus donnera le résultat suivant :
|
|
La requête ci-dessus donnera le résultat suivant :
Aucun des deux ne donne le résultat escompté. L’entité 12 devrait arriver en deuxième position et l’entité 5 en premier.
Solution en SQL
La solution SQL est simple :
|
|
Nous obtenons le bon résultat :
Problème lié à l’utilisation de l’API publique de Supabase
Mais comment s’y prendre avec le client JavaScript de Supabase ?
Clairement pas de la façon suivante !
|
|
Pour le code ci-dessus, vous obtenez une erreur :
|
|
Comment résoudre ce problème ?
Solution utilisant l’API publique de Supabase
La réponse : Les fonctions Postgres !
Dans notre cas, cela se présente comme suit. On déclare tout d’abord une fonction Postgres :
|
|
Pour l’utiliser, exécutez le code SQL ci-dessus sur l’éditeur SQL de Supabase, générez vos types TypeScript à l’aide de la CLI de Supabase et mettez à jour le code TypScript :
|
|
Je pourrais l’améliorer, mais il résout la logique métier à réaliser.
Pour en savoir plus, consultez la documentation officielle de Supabase :
Conclusion
C’était un sujet délicat, car je ne connaissais pas les fonctions Postgres. J’avais écrit un brouillon de cet article et en le complétant, j’ai réalisé que j’étais loin du but !
Avez-vous appris quelque chose aujourd’hui ? Ce fut clairement mon cas !
Suivez-moi !
Merci d’avoir lu cet article. Assurez-vous de me suivre sur X, de vous abonner à ma publication Substack et d’ajouter mon blog à vos favoris pour ne pas manquer les prochains articles.
Photo de Pavel Danilyuk.