Retour à la liste des articles Articles
7 minutes de lecture

Comment utiliser CASE dans ORDER BY en SQL

Cet article vous montrera comment et quand utiliser la fonction CASE dans une clause ORDER BY et quand l'utiliser.

Avez-vous déjà utilisé une instruction CASE? Je suis sûr que oui, au moins dans une instruction SELECT. Mais l'avez-vous déjà utilisée dans une clause ORDER BY? Non ? Vous le ferez, une fois que je vous aurai montré comment !

Ne vous inquiétez pas si vous n'avez jamais utilisé d'instruction CASE. Je vais vous la montrer et l'expliquer à l'aide d'un court exemple. Je passerai ensuite à d'autres utilisations de la déclaration CASE, notamment dans une clause ORDER BY.

Si vous souhaitez disposer de plusieurs sources de connaissances, voici un article expliquant ce qu' est CASE. Et en voici un autre qui explique comment utiliser CASE pour ajouter de la logique à un SELECT.

Qu'est-ce qu'une instruction CASE ?

Pour faire simple, il s'agit d'une instruction SQL qui parcourt et renvoie des valeurs en fonction des conditions spécifiées. Il s'agit de la façon dont SQL écrit la logique IF-THEN-ELSE et se compose de cinq mots-clés : CASE, WHEN, THEN, ELSE, et END.

Lorsqu'elle est utilisée dans une instruction SELECT, elle fonctionne de la manière suivante : si la cas quand la condition est remplie, alors retourner une certaine valeur, ou else retourner une autre valeur, et end vérifier les conditions. La syntaxe ressemble à ceci :

CASE
 WHEN  THEN ,
 WHEN  THEN 
 ELSE 
END AS 

Je pense que la meilleure façon d'expliquer cette syntaxe est de la présenter dans un exemple. L'utilisation la plus basique de CASE est dans une déclaration SELECT, alors commençons par un exemple.

CASE dans SELECT

Voici le tableau films que je vais utiliser dans cet exemple :

idfilm_titleyeardirector
1True Grit2010The Coen Brothers
2Da 5 Bloods2020Spike Lee
3Alien1979Ridley Scott
4The Bridges Of Madison County1995Clint Eastwood
5Get Out2017Jordan Peele
6Annie Hall1977Woody Allen
7Goodfellas1990Martin Scorsese
8Dr.Strangelove1964Stanley Kubrick
9You Were Never Really Here2017Lynne Ramsay
10Albert Nobbs2011Rodrigo Garcia

Supposons maintenant que nous voulions écrire une requête qui, en plus des colonnes de la table, affiche une colonne supplémentaire avec le siècle dans lequel le titre a été filmé. Un exemple de requête ressemble à ceci :

SELECT
*,
	CASE
		WHEN year < 2001 THEN '20th-century film'
		ELSE '21st-century film'
	END AS century
FROM films;

Cette requête sélectionne toutes les colonnes de la table films. Puis elle utilise une instruction CASE pour placer des valeurs dans une nouvelle colonne appelée century. Cette instruction signifie que si la colonne year est inférieure (c'est-à-dire antérieure) à 2001, la valeur de la colonne century doit être "film du XXe siècle". Si ce n'est pas le cas, la valeur doit être "film du 21e siècle".

Voyons les résultats de la requête :

idfilm_titleyeardirectorcentury
1True Grit2010The Coen Brothers21st-century film
2Da 5 Bloods2020Spike Lee21st-century film
3Alien1979Ridley Scott20th-century film
4The Bridges Of Madison County1995Clint Eastwood20th-century film
5Get Out2017Jordan Peele21st-century film
6Annie Hall1977Woody Allen20th-century film
7Goodfellas1990Martin Scorsese20th-century film
8Dr.Strangelove1964Stanley Kubrick20th-century film
9You Were Never Really Here2017Lynne Ramsay21st-century film
10Albert Nobbs2011Rodrigo Garcia21st-century film

CASE est-il utilisé uniquement dans les instructions SELECT ?

Non, pas du tout ! Bien qu'il y soit le plus souvent utilisé, CASE ne se limite pas aux instructions SELECT. Par exemple, vous pouvez l'utiliser dans des clauses telles que IN, WHERE, HAVING et ORDER BY.

Le fait d'utiliser une fois une déclaration CASE dans une requête ne signifie pas que vous avez atteint votre quota d'utilisation. Vous pouvez l'utiliser plusieurs fois dans une même requête. Vous pouvez aussi l'utiliser une seule fois. Cela signifie que vous n'avez pas besoin d'avoir CASE dans SELECT si vous voulez juste l'utiliser dans un ORDER BY.

À ce propos, le but principal de cet article est de vous montrer comment fonctionne l'instruction CASE dans une clause ORDER BY. J'y arrive maintenant.

Quand l'instruction CASE est-elle utilisée dans un ORDER BY ?

La clause ORDER BY est utilisée pour trier le résultat dans un ordre croissant ou décroissant. Vous voulez vous rafraîchir la mémoire sur son fonctionnement ? Pas de problème ! Cet article explique ce que fait un ORDER BY.

L'introduction d'une instruction CASE ici peut améliorer votre ORDER BY en vous permettant d'ordonner les résultats selon d'autres (et multiples) critères. Par exemple, vous pouvez l'utiliser lorsque vous souhaitez trier des valeurs de chaînes de caractères selon des critères autres que l'ordre alphabétique, par exemple en fonction de la position hiérarchique des titres de postes dans une entreprise.

L'utilisation de l'instruction CASE vous permet également de trier des données en fonction de plusieurs critères. Par exemple, vous pouvez vouloir trier vos utilisateurs par pays et par nom, mais plutôt par pays et par état s'ils sont des États-Unis.

Je vais vous montrer un exemple pratique, et vous saurez immédiatement de quoi je parle.

CASE dans ORDER BY

Ici, nous travaillons avec le tableau shopsqui contient les données suivantes :

idshop_namecountrystatecity
1Zoltan's shopCroatiaNULLZagreb
2Ante PortasCroatiaNULLRijeka
3Green Mile 1USATennesseeMemphis
4Jan Pieter's PitaCroatiaNULLSplit
5Green Mile 2USATennesseeChattanooga
6Green Mile 3USANew OrleansLouisiana
7Krystyna's shopHungaryNULLPecs
8Quinn & SandyHungaryNULLGyor
9Green Mile 4USACaliforniaSan Francisco
10FragolaCroatiaNULLOsijek

Nous devons d'abord ordonner les données par country. Ensuite, chaque magasin d'un même pays doit être trié par city. Si le magasin se trouve aux États-Unis, nous devons ensuite le trier par la colonne state. Le code qui résout ce petit problème est le suivant :

SELECT *
FROM shops
ORDER BY country,
	CASE
		WHEN country = 'USA' THEN state
		ELSE city
	END;

Il sélectionne toutes les colonnes du tableau shops. Elle ordonne ensuite le résultat d'abord par pays, puis par les critères de l'instruction CASE. Il est dit que si country = 'USA', alors le résultat est trié par état. Si ce n'est pas le cas, il est trié par city.

Il semble que ce code renvoie effectivement le résultat souhaité :

idshop_namecountrystatecity
10FragolaCroatiaNULLOsijek
2Ante PortasCroatiaNULLRijeka
4Jan Pieter's PitaCroatiaNULLSplit
1Zoltan's shopCroatiaNULLZagreb
8Quinn & SandyHungaryNULLGyor
7Krystyna's shopHungaryNULLPecs
9Green Mile 4USACaliforniaSan Francisco
6Green Mile 3USANew OrleansLouisiana
5Green Mile 2USATennesseeChattanooga
3Green Mile 1USATennesseeMemphis

Autres utilisations de l'instruction CASE

Vous pouvez également utiliser l'instruction CASE avec des mots-clés autres que ceux que j'ai mentionnés. Par exemple, vous pouvez l'utiliser avec DESC. Imaginons que je la mette dans le code ci-dessus :

SELECT *
FROM shops
ORDER BY country,
	CASE
		WHEN country = 'USA' THEN state
		ELSE city
	END DESC;

Dans l'exemple précédent, j'ai omis le mot-clé DESC. Par défaut, le résultat est trié par ordre croissant. En écrivant DESC après l'instruction CASE, vous obtenez les magasins des pays classés par city dans l'ordre décroissant, et non croissant comme dans le cas précédent. Les magasins des États-Unis sont classés par state mais cette fois-ci dans l'ordre décroissant.

Nous pouvons voir le résultat ici :

idshop_namecountrystatecity
1Zoltan's shopCroatiaNULLZagreb
4Jan Pieter's PitaCroatiaNULLSplit
2Ante PortasCroatiaNULLRijeka
10FragolaCroatiaNULLOsijek
7Krystyna's shopHungaryNULLPecs
8Quinn & SandyHungaryNULLGyor
5Green Mile 2USATennesseeChattanooga
3Green Mile 1USATennesseeMemphis
6Green Mile 3USANew OrleansLouisiana
9Green Mile 4USACaliforniaSan Francisco

Vous pouvez également utiliser les instructions CASE avec UPDATE, INSERT et DELETE. C'est ce qu'on appelle des instructions de modification de données. Voici un article expliquant comment utiliser CASE avec ces instructions. Vous pouvez également l'utiliser pour la compression conditionnelle.

Vous voulez en savoir plus sur l'instruction CASE ?

Vous êtes probablement surpris de constater que les instructions CASE ne sont pas utilisées uniquement dans les instructions SELECT. Vous avez pu constater qu'elle est très utile lorsqu'elle est utilisée avec une instruction ORDER BY. Elle offre de nombreuses possibilités pour ordonner les résultats des requêtes.

Mais ce n'est pas tout. L'instruction CASE peut être utilisée avec d'autres instructions et mots-clés, comme les instructions de modification de données, ou même DESC, IN, WHERE et HAVING.

Il est maintenant temps d'en savoir plus et de mettre en pratique ce que vous avez appris. C'est ce que vous propose notre cours Fonctions SQL standards . Ce cours fait partie d'une piste beaucoup plus large nommée Le SQL de A à Z. Qu'est-ce que vous attendez ?