Retour à la liste des articles Articles
10 minutes de lecture

Utilisation de CASE pour ajouter de la logique à une instruction SELECT

Lorsque vous écrivez une requête SQL, vous pouvez avoir besoin d'obtenir des valeurs de plusieurs colonnes et de changer des valeurs d'une forme à une autre. Le moyen le plus simple d'atteindre cet objectif est d'ajouter une expression CASE à votre instruction SELECT. Dans cet article, nous allons vous présenter la syntaxe, les formats et les utilisations de l'expression CASE.

L'expression CASE est une expression conditionnelle : elle évalue des données et renvoie un résultat. Le résultat qu'elle renvoie est basé sur le fait que les données répondent à certains critères. Cette expression peut être utilisée dans les instructions SELECT, UPDATE, et DELETE ou dans les clauses WHERE, IN, LIKE, ORDER BY, et HAVING. Nous allons nous concentrer sur l'instruction SELECT et utiliser les opérateurs IN et LIKE.

Vous devez savoir qu'il existe deux types d'expressions CASE: simples et recherchées. Nous examinerons les deux, mais nous commencerons par la syntaxe de base de cette expression.

Syntaxe CASE

La syntaxe de base de l'expression CASE est présentée ci-dessous :

CASE   [ column or expression ]
	WHEN  value or condition THEN when_result
	...
	ELSE else_result
END

L'expression commence par le mot clé CASE et se termine par le mot clé END. Les noms des colonnes ou expressions spécifiques sont saisis après le mot-clé CASE. Les mots-clés WHEN et THEN définissent les conditions logiques. Après la clause WHEN, on voit la condition ou la valeur à comparer ; le THEN détermine le résultat si la condition est remplie. Une instruction facultative ELSE détermine le résultat renvoyé si la condition WHEN n'est pas remplie. Si ELSE n'est pas définie et que WHEN n'est pas satisfaite, un NULL sera renvoyé.

Il existe deux types d'expressions CASE: simples et recherchées. Chacune a une syntaxe légèrement différente, et chacune fonctionne un peu différemment.

Nous allons commencer par le format simple.

CASE : le format simple

L'expression simple CASE compare une valeur à une ou plusieurs conditions WHEN. Si elle répond à une condition WHEN, le résultat THEN est renvoyé. Voici à quoi ressemble la syntaxe :

CASE column_or_expression
    WHEN  value THEN when_result
    ...
    ELSE else_result
END

Dans une expression simple CASE, le nom de la colonne ou de l'expression à évaluer est absolument nécessaire. Il est placé après le mot-clé CASE. La valeur définie est placée après le mot clé WHEN. Si la valeur évaluée est la même que la valeur définie, le résultat défini dans THEN est retourné. Si la valeur de la colonne ou de l'expression ne correspond à aucune valeur de WHEN, le résultat de ELSE est affiché. N'oubliez pas que ELSE est facultatif.

Les exemples de requêtes suivants sont basés sur les données de la table animal comme indiqué ci-dessous :

id name weight country number_of_animal zoo
1 Tiger 120 Russia 3 1
2 African elephant 4 800 Congo 5 1
3 Lion 175 Turkey 1 1
4 Koala 9 Australia 2 NULL
5 Giraffe 800 5 2
6 Gaur NULL China 2 1
7 Okapi 225 NULL 5 0

Regardez ce simple CASE:

CASE  zoo 
  WHEN 1 THEN 'Brookfield Zoo'
  WHEN 2 THEN 'Dublin zoo'
  ELSE 'unknown'
END 

Cet exemple sélectionne les données de la table animal et affiche le nom du zoo actuel de l'animal. Si zoo=1, alors Brookfield Zoo sera affiché ; si zoo=2 alors nous verrons Dublin Zoo; tous les autres cas seront affichés comme unknown.

Le résultat est :

name zoo case
Tiger 1 Brookfield Zoo
African elephant 1 Brookfield Zoo
Lion 1 Brookfield Zoo
Koala NULL unknown
Giraffe 2 Dublin zoo
Gaur 1 Brookfield Zoo
Okapi 0 unknown

Remarquez que si la valeur de la colonne zoo n'est pas la même que l'une des valeurs des clauses WHEN (ou est NULL), le résultat est unknown.

Jusqu'à présent, nous avons considéré les expressions simples CASE qui ont un nom de colonne après le mot-clé CASE. Vous pouvez également placer une expression après le mot-clé CASE.

Imaginez que, outre le poids des animaux en kilogrammes, vous souhaitiez également afficher le poids total des mammifères par espèce - mais seulement si ces valeurs sont particulières. Dans ce cas, trois nombres caractéristiques doivent être déterminés. Ils seront affichés sous forme de chaînes de caractères. Si le poids total ne correspond pas à l'un de ces trois nombres, un autre sera affiché.

Voici la requête :

SELECT name, weight, number_of_animal,
		( CASE  number_of_animal*weight 
  			WHEN 18 THEN 'small'
  			WHEN 360 THEN 'middle'
  			WHEN 24000 THEN 'big'
  			ELSE 'other'
		  END 
                 ) as total_weight
FROM  animal ;

Regardez le résultat :

name weight number_of_animal total_weight
Tiger 120 3 middle
African elephant 4 800 5 big
Lion 175 1 other
Koala 9 2 small
Giraffe 800 5 other
Gaur NULL 2 other
Okapi 225 5 other

Cette expression CASE contient une clause ELSE qui affiche other. Sans le ELSE, tous les poids non correspondants afficheraient un NULL. Voici le même code sans ELSE:

SELECT  name, weight, number_of_animal,
			 CASE  number_of_animal*weight 
  				WHEN 18 THEN 'small'
  				WHEN 360 THEN 'middle'
  				WHEN 24000 THEN 'big'
			 END 
                         as total_weight
FROM  animal ;

Et les résultats :

name weight number_of_animal total_weight
Tiger 120 3 middle
African elephant 4 800 5 big
Lion 175 1 NULL
Koala 9 2 small
Giraffe 800 5 NULL
Gaur NULL 2 NULL
Okapi 225 5 NULL

Utilisation d'alias dans les déclarations CASE

L'expression CASE peut avoir un alias, ou un nom pour la nouvelle colonne résultante. La requête ci-dessus, maintenant avec un alias, ressemble à ceci :

SELECT name, zoo, 
			  CASE  zoo 
  			     WHEN 1 THEN 'Brookfield Zoo'
  			     WHEN 2 THEN 'Dublin zoo'
  			     ELSE 'unknown'
			   END 
			  as name_zoo
FROM  animal ;

Et le résultat :

name zoo name_zoo
Tiger 1 Brookfield Zoo
African elephant 1 Brookfield Zoo
Lion 1 Brookfield Zoo
Koala NULL unknown
Giraffe 2 Dublin zoo
Gaur 1 Brookfield Zoo
Okapi 0 unknown

Utilisation de CASE avec d'autres types de données

Vous pouvez utiliser l'expression CASE avec d'autres types de données, tels que CHARACTER.

Regardez cette requête :

SELECT  name, zoo, 
			   ( CASE  country 
 			 	WHEN 'Russia' THEN 'Europe'
  				WHEN 'Congo' THEN 'Africa'
 				WHEN 'Turkey' THEN 'Asia'
  				WHEN 'Australia' THEN 'Australia' 
  				WHEN 'China' THEN 'Asia'
  				ELSE 'unknown'
				END 
                            ) as continent
FROM  animal ;

Cette requête sélectionne des données dans la table et affiche le continent d'où provient l'animal. Le continent est basé sur la colonne country, qui utilise le type de données CHARACTER.

Voici le résultat :

name zoo continent
Tiger 1 Europe
African elephant 1 Africa
Lion 1 Asia
Koala NULL Australia
Giraffe 2 unknown
Gaur 1 Asia
Okapi 0 unknown

L'expression CASE recherchée

L'expression recherchée CASE est le format le plus couramment utilisé. Mais au lieu de comparer une colonne ou une expression à un ensemble défini de valeurs, une expression recherchée peut comparer plusieurs conditions WHEN et déterminer un résultat. Cela fait d'une expression recherchée CASE le meilleur choix pour une logique plus complexe.

Voici la syntaxe :

CASE 
    WHEN  conditions THEN when_result
    ...
    ELSE else_result
END

Une fois encore, l'expression commence par le mot-clé CASE, mais aucun nom de colonne ni aucune expression ne suit. Il peut y avoir plusieurs constructions WHEN - THEN, tout comme le simple CASE. Mais après le mot-clé WHEN, nous saisissons une ou plusieurs conditions plutôt que des valeurs définies. Ces conditions compareront une valeur extraite et renverront la première qu'elle rencontre comme TRUE. Le résultat de THEN s'affichera alors. Si toutes les conditions renvoient FALSE, c'est le résultat de ELSE qui s'affiche. Et encore une fois, ELSE est facultatif.

Tout cela peut sembler difficile à comprendre, alors examinons notre exemple de requête :

SELECT  name, weight,
		  CASE 
  		    WHEN weight>1000 THEN 'big'
  		    WHEN weight BETWEEN 100  AND 1000 THEN 'middle'
		    WHEN weight<100 THEN 'small'
	            ELSE '---'
		  END 
		  as description_weight
FROM  animal ;

Regardez les résultats :

name weight description_weight
Tiger 120 middle
African elephant 4 800 big
Lion 175 middle
Koala 9 small
Giraffe 800 middle
Gaur NULL
Okapi 225 middle

La première clause WHEN vérifie si weight est supérieur à 1 000 kilogrammes. Si c'est le cas, la chaîne big est renvoyée. La condition suivante WHEN vérifie si weight se situe entre 100 et 1 000 kilogrammes. Si c'est le cas, la chaîne middle est renvoyée. Dans ce cas, l'opérateur BETWEEN AND est utilisé pour définir l'intervalle. Pour les animaux dont weight est inférieur à 100 kilogrammes, la chaîne small sera affichée. Dans tous les autres cas, la valeur de retour sera "-".

Utilisation de CASE avec LIKE

Vous pouvez utiliser d'autres opérateurs avec l'expression CASE. Dans l'exemple suivant, nous utiliserons l'opérateur LIKE, qui correspond à des motifs dans les sous-chaînes de recherche. (Pour plus d'informations sur l'opérateur LIKE, lisez Utilisation de LIKE pour faire correspondre des motifs en SQL).

Voici l'exemple :

SELECT name, 
		( CASE 
  			WHEN name LIKE '____' THEN '4 letters'
  			WHEN name LIKE '_____' THEN '5 letters'
 			ELSE 'other'
		  END 
		) as description
FROM  animal ;

Et voici le résultat :

name description
Tiger 5 letters
African elephant other
Lion 4 letters
Koala 5 letters
Giraffe other
Gaur 4 letters
Okapi 5 letters

Dans cette expression recherchée CASE, l'opérateur LIKE teste si le nom de l'animal est composé de quatre ou cinq lettres. Dans d'autres cas - comme pour l'éléphant d'Afrique - la valeur de retour est autre.

Utilisation de CASE avec IN

Dans l'exemple suivant, nous allons tester l'opérateur IN. Vous vous souvenez de la simple expression CASE qui renvoyait le nom d'un continent en fonction du pays associé à un animal ? Le code de cette requête était long, grâce à de nombreuses constructions distinctes WHEN - THEN. Ci-dessous, nous vous donnons un autre aperçu de l'ancien code :

SELECT  name, country,
			( CASE  country 
  				WHEN 'Russia' THEN 'Europe'
  				WHEN 'Congo' THEN 'Africa'
  				WHEN 'Turkey' THEN 'Asia'
 				WHEN 'Australia' THEN 'Australia' 
  				WHEN 'China' THEN 'Asia'
  				ELSE 'unknown'
			  END 
                         ) as continent
FROM  animal ;

L'opérateur IN vous permet de réduire la quantité de code. Regardez une recherche CASE avec l'opérateur IN:

SELECT name, country, 
		( CASE   
 		    WHEN country IN ('Russia') THEN 'Europe'
 		    WHEN country IN ('Congo') THEN 'Africa'
		    WHEN country IN ('Turkey','China') THEN 'Asia'
 		    WHEN country IN ('Australia') THEN 'Australia' 
	            ELSE 'unknown'
		  END 
		) as continent
FROM  animal ;

Nous pouvons utiliser l'opérateur IN pour lister plusieurs pays d'un même continent. Si la valeur de la colonne country correspond à l'une des chaînes de caractères de la clause IN, le résultat est le continent de la clause THEN. Bien entendu, si le nom du pays n'est répertorié dans aucun des opérateurs IN, ELSE entre en jeu et renvoie une valeur unknown.

Regardez le tableau de résultats ci-dessous :

name country continent
Tiger Russia Europe
African elephant Congo Africa
Lion Turkey Asia
Koala Australia Australia
Giraffe unknown
Gaur China Asia
Okapi NULL unknown

Ordonner les conditions dans CASE

Vous pouvez maintenant créer des conditions dans la clause WHEN. Mais il est important de les construire avec précision. Si votre valeur de test correspond à la première clause WHEN, la clause THEN est renvoyée et l'expression CASE est terminée. Même si une valeur répond en fait à plusieurs conditions WHEN, la première condition qu'elle remplit est la seule qui sera renvoyée.

Regardez l'exemple suivant :

SELECT name, weight,
				( CASE 
  					WHEN weight<1000 THEN 'not big'
  					WHEN weight<100 THEN 'not middle'
  					WHEN weight<10 THEN 'very small'
 					ELSE '---'
			  	  END 
				) as description_weight
FROM  animal ;

Dans ce cas, la valeur weight sera la première à remplir la condition initiale WHEN. Dans notre tableau, la plupart des animaux auront une valeur weight inférieure à 1 000 kg. Seuls les animaux dont la valeur associée à weight est supérieure ou égale à 1 000 (ou dont la valeur de weight est NULL) se verront renvoyer une valeur "-".

Voici les résultats :

name weight description_weight
Tiger 120 not big
African elephant 4 800
Lion 175 not big
Koala 9 not big
Giraffe 800 not big
Gaur NULL
Okapi 225 not big

N'oubliez pas que l'ordre des conditions WHEN est très important ; il peut affecter les résultats que vous obtenez.

En savoir plus sur l'expression SQL CASE

Savoir utiliser une expression CASE correctement formatée est une bonne aptitude à cultiver. Elle vous permet d'obtenir les résultats que vous attendez de vos requêtes.

Si vous souhaitez en savoir plus sur l'expression CASE, consultez le cours LearnSQL Fonctions SQL standards de LearnSQL. Il vous montrera comment construire des requêtes qui utilisent cette expression et bien d'autres. Vous aurez également l'occasion de mettre en pratique vos connaissances. Essayez-le dès aujourd'hui !