Instruction CASE et cas imbriqués dans SQL Server : exemple T-SQL

⚡ Résumé intelligent

CASE est une expression conditionnelle dans SQL Server qui renvoie une valeur en fonction de la première condition qui est évaluée à vrai, offrant des formes Simple et Searched ainsi que l'imbrication dans IF…ELSE, UPDATE et ORDER BY.

  • 🧭 Valeur conditionnelle : Une expression CASE renvoie une valeur qui dépend de la condition WHEN qui est évaluée comme vraie en premier.
  • 1️⃣ CAS simple : L'instruction CASE simple compare une expression à une liste de valeurs et effectue un contrôle d'égalité pour chaque condition WHEN.
  • ???? Dossier recherché : La fonction CASE recherchée évalue une expression booléenne distincte pour chaque condition WHEN, prenant en charge les plages et les opérateurs d'inégalité.
  • ➖ SINON est facultatif : Lorsque la clause WHEN ne correspond à aucune condition et que la clause ELSE est omise, l'expression CASE renvoie NULL.
  • 🪆 Imbrication : L'instruction CASE peut être imbriquée dans une autre instruction CASE et dans une instruction IF…ELSE pour une logique à plusieurs niveaux.
  • 🔧 Au-delà de SELECT : Outre SELECT, CASE fonctionne avec les clauses UPDATE et ORDER BY pour effectuer des mises à jour conditionnelles et des tris.

Instruction CASE et instructions CASE imbriquées dans SQL Server avec exemples T-SQL

Aperçu de Case dans la vraie vie !

Là encore, dans la vie réelle, nous agissons différemment selon les circonstances. Pour illustrer ce propos, prenons l'exemple suivant :

  • Si les billets d'avion coûtent moins de 100 $, je visiterai Los Angeles.
  • Si les billets d'avion coûtent entre 100 et 200 dollars, alors j'irai à New York.
  • Si les billets d'avion coûtent entre 200 et 400 dollars, alors j'irai en Europe.
  • Sinon, je préférerai visiter un site touristique à proximité.

Considérons maintenant la possibilité de catégoriser séparément la condition et l'action à partir de l'exemple ci-dessus :

Conditions – Billets d'avion Actions effectuées uniquement si la condition est VRAIE
Moins de 100 $ Visitez Los Angeles
Entre $ 100 et $ 200 Visiter New-York
Entre $ 200 et $ 400 Visiter l'Europe
Aucune des conditions ci-dessus n'est remplie Lieu touristique à proximité

Dans l'exemple ci-dessus, on constate que le résultat des différentes conditions détermine une action distincte. Par exemple, le visiteur se rendra à New York uniquement si le prix du billet d'avion se situe entre 100 et 200 dollars. De même, MS SQL L'instruction CASE offre également la possibilité d'exécuter différentes instructions T-SQL en fonction du résultat de différentes conditions.

Qu’est-ce que l’instruction CASE dans SQL Server ?

Instruction CASE dans SQL Server est l'extension de SINON Contrairement à l'instruction IF…ELSE, qui n'autorise qu'une seule condition, l'instruction CASE permet à l'utilisateur d'appliquer plusieurs conditions pour effectuer différentes actions dans MS SQL. Elle renvoie la valeur correspondante à la condition définie par l'utilisateur.

Apprenons à utiliser CASE dans SQL et son concept dans les sections suivantes. En MS SQL, il existe deux types d'instructions CASE :

  • CAS SIMPLE
  • CAS recherché

CAS SIMPLE

Syntaxe pour les cas simples

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Ici:

  • Le paramètre Case_Expression désigne l'expression qui sera finalement comparée à Value_1, Value_2, etc.
  • Les paramètres Statement_1, Statement_2… désignent les instructions qui seront exécutées si Case_Expression = Value_1, Case_Expression = Value_2, etc.
  • En résumé, la condition est de savoir si Case_Expression = Value_N, et l'action est l'exécution de Statement_N si le résultat ci-dessus est VRAI.
  • Le paramètre ALIAS_NAME est facultatif et correspond à l'alias attribué au résultat de l'instruction CASE de SQL Server. Il est principalement utilisé lorsque CASE est employé dans la clause SELECT de SQL Server.

Règles pour les cas simples

  • Simple Case n'autorise qu'une vérification d'égalité de Case_Expression avec Value_1 à Value_N.
  • L'expression Case_Expression est comparée à une valeur, dans l'ordre, en commençant par la première valeur, c'est-à-dire Value_1. Voici le mode d'exécution :
  • Si Case_Expression est équivalent à Value_1, alors les autres instructions WHEN…THEN sont ignorées et l'exécution de CASE se terminera immédiatement.
  • Si Case_Expression ne correspond pas à Value_1, elle est comparée à Value_2 pour déterminer son équivalence. Ce processus de comparaison se poursuit jusqu'à ce que Case_Expression trouve une valeur équivalente parmi Value_1, Value_2, etc.
  • Si aucune correspondance n'est trouvée, le contrôle passe à l'instruction ELSE, et Statement_Else est exécutée.
  • ELSE est facultatif.
  • Si ELSE n'est pas présent et que Case_Expression ne correspond à aucune des valeurs, alors NULL est affiché.

Le diagramme ci-dessous illustre le flux d'exécution d'un cas simple :

Organigramme montrant comment une instruction CASE simple évalue chaque valeur WHEN dans l'ordre

Exemples

Supposons que nous ayons une table nommée 'Guru99' avec deux colonnes, Tutorial_ID et Tutorial_name, et quatre lignes, comme indiqué ci-dessous. Nous utiliserons ce 'GuruTableau 99 dans les exemples qui suivent.

Échantillon GuruTableau 99 avec les colonnes Tutorial_ID et Tutorial_name et quatre lignes

Requête 1 : CAS SIMPLE avec l'option NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Résultat : Le diagramme ci-dessous explique le flux d’exécution d’un cas simple sans instruction else.

Résultat d'une instruction CASE simple sans ELSE, affichant un Description pour chaque nom_de_tutoriel

Requête 2 : CASE SIMPLE avec l'option ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Résultat : Le diagramme ci-dessous explique le flux d’exécution d’un cas simple avec une instruction ELSE.

Résultat d'une instruction CASE simple avec ELSE, renvoyant le texte par défaut pour les lignes non correspondantes.

CAS recherché

Syntaxe pour la recherche de cas

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Ici:

  • Le paramètre Boolean_Expression_1… désigne l'expression qui sera évaluée pour VRAI ou FAUX.
  • Les paramètres Statement_1, Statement_2… désignent les instructions qui seront exécutées si le résultat correspondant de Boolean_Expression_1, Boolean_Expression_2 est TRUE.
  • En résumé, la condition est Boolean_Expression_1… et l'action consiste à exécuter Statement_N si l'expression Boolean_Expression_1 ci-dessus est VRAIE.
  • L'argument ALIAS_NAME est facultatif et correspond à l'alias donné au résultat de l'instruction CASE. Il est généralement utilisé lorsque CASE figure dans la clause SELECT.

Règles pour le cas recherché

  • Contrairement au cas simple, le cas recherché ne se limite pas à un simple contrôle d'égalité, mais autorise une expression booléenne.
  • L'expression booléenne est évaluée séquentiellement, en commençant par la première expression booléenne, c'est-à-dire Boolean_Expression_1. Voici le mode d'exécution :
  • Si Boolean_Expression_1 est TRUE, alors les instructions WHEN…THEN suivantes sont ignorées et l'exécution de CASE se termine immédiatement.
  • Si Boolean_Expression_1 est FAUX, alors Boolean_Expression_2 est évaluée pour déterminer si elle est VRAIE. Ce processus d'évaluation des expressions booléennes se poursuit jusqu'à ce que l'une des expressions booléennes soit VRAIE.
  • Si aucune correspondance n'est trouvée, le contrôle passe à l'instruction ELSE, et Statement_Else est exécutée.
  • Comme dans le cas simple, ELSE est également facultatif dans le cas recherché.
  • Si ELSE n'est pas présent et qu'aucune des expressions booléennes ne renvoie TRUE, alors NULL est affiché.

Le diagramme ci-dessous illustre le flux d'exécution du cas recherché :

Organigramme montrant comment une instruction CASE recherchée évalue chaque expression booléenne dans l'ordre

Exemples

Requête 1 : CAS RECHERCHÉ avec l'option NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Résultat : Le diagramme ci-dessous explique le flux d'exécution du cas recherché sans clause ELSE.

Résultat d'une recherche CASE sans ELSE, faisant correspondre chaque Tutorial_name à un Description CMS

Requête 2 : CASE RECHERCHÉ avec l'option ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Résultat : Le diagramme ci-dessous explique le flux d’exécution du cas recherché avec la clause ELSE.

Résultat d'une recherche CASE avec ELSE, renvoyant le texte par défaut pour les langues non SQL

Différence entre l'approche d'exécution : cas simple et cas de recherche

Examinons l'exemple du CAS SIMPLE ci-dessous :

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Ici, « Tutorial_name » fait partie de l’expression CASE en SQL. La valeur de « Tutorial_name » est ensuite comparée à chaque valeur WHEN, c’est-à-dire « SQL »… jusqu’à ce que « Tutorial_name » corresponde à une valeur WHEN.

Au contraire, l'exemple SEARCH CASE ne contient aucune expression CASE :

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Ici, chaque instruction WHEN possède sa propre expression booléenne conditionnelle. Chaque expression booléenne, par exemple Tutorial_name = 'SQL'…, est évaluée pour VRAI/FAUX jusqu'à la première expression booléenne qui est évaluée à VRAI.

Différence entre le cas simple et le cas recherché

Cas simple Cas recherché
Le mot-clé CASE est immédiatement suivi de l'expression CASE et précède l'instruction WHEN.

Par exemple:
CAS
QUAND Valeur_1 ALORS Déclaration_1…

Le mot-clé CASE est suivi de l'instruction WHEN, et il n'y a pas d'expression entre CASE et WHEN.

Par exemple:
CAS OÙ ALORS Déclaration_1…

Dans un cas simple, une valeur est associée à chaque instruction WHEN. Ces valeurs (Valeur_1, Valeur_2…) sont comparées séquentiellement à une seule expression CASE. Le résultat est évalué pour déterminer si la condition est VRAI ou FAUX pour chaque instruction WHEN.

Par exemple:
CAS
QUAND Valeur_1 ALORS Déclaration_1…
QUAND Valeur_2 ALORS Déclaration_2…

Dans un cas de recherche, une expression booléenne est associée à chaque instruction WHEN. Ces expressions booléennes (Boolean_Expression_1, Boolean_Expression_2…) évaluent la condition VRAI/FAUX pour chaque instruction WHEN.

Par exemple:
BOÎTIER
QUAND ALORS Déclaration_1…
QUAND ALORS Déclaration_2…

Un cas simple ne prend en charge qu'une vérification d'égalité, c'est-à-dire si CASE_Expression = VALUE_1, VALUE_2…

Par exemple:
CAS QUAND Valeur_1 ALORS Instruction_1…
Dans l'exemple ci-dessus, la seule opération effectuée par le système consiste à vérifier si Case_Expression = Value_1.

Avec Boolean_Expression_N, un cas recherché prend en charge toute opération produisant une valeur booléenne. Cela inclut les opérateurs d'égalité et de différence.

Par exemple:
CAS OÙ ALORS Déclaration_1…
Dans l'exemple ci-dessus, Boolean_Expression_1 peut contenir à la fois les opérateurs « égal à » et « différent de », comme A = B, A != B.

CASE imbriqué : CASE dans IF ELSE

Nous pouvons utiliser CASE à l'intérieur d'une instruction IF…ELSE. Nous déclarons une variable pour le billet d'avion et la branche en fonction de sa valeur. Voici un exemple de code MS-SQL :

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

Dans l'exemple ci-dessus, l'instruction CASE est imbriquée dans une instruction IF…ELSE. L'instruction IF s'exécute en premier, et si la condition CASE dans SQL Server est fausse, l'instruction ELSE s'exécute. La partie ELSE contient une instruction CASE imbriquée dans SQL. Selon la valeur du billet d'avion, l'un des résultats suivants s'affiche :

  • Le système affiche « Visitez un site touristique à proximité » si les billets d'avion coûtent plus de 400 $.
  • Le système affiche « Visitez Los Angeles » si le prix des billets d'avion est compris entre 0 et 100 dollars.
  • Le système affiche « Visitez New York » si les billets d'avion coûtent entre 101 $ et 200 $.
  • Le système affiche « Visitez l'Europe » si les billets d'avion coûtent entre 201 $ et 400 $.

Le résultat ci-dessous indique l'emplacement renvoyé lorsque l'instruction CASE imbriquée est exécutée à l'intérieur de la branche ELSE :

Résultat d'une instruction CASE imbriquée dans une instruction IF…ELSE, affichant le lieu de visite du billet

CASE imbriqué : CASE dans CASE

En SQL, il est possible d'imbriquer des instructions CASE. Voici un exemple de code MS-SQL :

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

Dans l'exemple ci-dessus, une instruction CASE est imbriquée dans une autre instruction CASE. Le système exécute d'abord l'instruction CASE externe ; si Flight_Ticket < $400, l'instruction CASE interne est exécutée. La destination renvoyée suit les mêmes tranches de prix que dans l'exemple précédent : un billet à 250 $ se situe dans la tranche 201 $–400 $ et la destination renvoyée est « Visit Europe ».

Le résultat ci-dessous indique l'emplacement renvoyé par le CASE interne pour un billet de 250 $ :

Résultat d'une requête imbriquée dans une autre requête, renvoyant Visit Europe pour un billet à 250 €

CAS avec MISE À JOUR

Supposons à nouveau que nous ayons le 'GuruTableau 99' à deux colonnes et quatre lignes, comme illustré ci-dessous :

GuruTableau 99 avant la mise à jour CASE, affichant les valeurs originales de Tutorial_Name

Nous pouvons utiliser CASE avec UPDATE. Vous trouverez ci-dessous l'exemple de code MS-SQL :

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

Dans l'exemple ci-dessus, l'instruction CASE est utilisée dans la clause UPDATE. Selon la valeur de Tutorial_Name, la colonne Tutorial_Name est mise à jour avec la valeur de l'instruction THEN :

  • Si Tutorial_Name = 'SQL', alors mettez à jour Tutorial_Name en 'Structured Query language'.
  • Si Tutorial_Name = 'PL/SQL', alors mettre à jour Tutorial_Name à 'Oracle PL/SQL'.
  • Si Tutorial_Name = 'MSSQL', alors mettez à jour Tutorial_Name à 'Microsoft SQL'.
  • Si Tutorial_Name = 'Hadoop', alors mettez à jour Tutorial_Name à 'Apache Hadoop'.

L'exécution de cette instruction met à jour les lignes correspondantes, comme indiqué ci-dessous :

Résultat de l'exécution de l'instruction CASE UPDATE sur le GuruTable 99

Interrogeons le «GuruTableau 99 pour vérifier les valeurs mises à jour :

GuruTableau 99 après la mise à jour de cas, affichant les nouvelles valeurs de Tutorial_Name

CAS avec Commande par

Nous pouvons utiliser CASE avec ORDER BY. Voici un exemple de code MS-SQL :

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

Ici, l'instruction CASE est utilisée avec la clause ORDER BY. L'argument @Order est défini sur 1, et comme la première expression booléenne WHEN est évaluée à TRUE, Tutorial_ID est sélectionné pour la condition ORDER BY. Le résultat est affiché ci-dessous :

Résultat de la commande ORDER BY avec une expression CASE triant le GuruTableau 99 par Tutorial_ID

Faits intéressants!

  • L'instruction CASE peut être imbriquée dans une autre instruction CASE ainsi que dans une instruction IF…ELSE.
  • En plus de SELECT, CASE peut être utilisé avec d'autres clauses SQL comme UPDATE et ORDER BY.

FAQ

La fonction IIF() est une abréviation pour une expression CASE à deux résultats : elle renvoie une valeur lorsque la condition est vraie et une autre lorsqu'elle est fausse. Une expression CASE complète est plus flexible et permet de tester plusieurs conditions WHEN en une seule instruction.

Oui. Puisque CASE renvoie une valeur, il peut figurer dans une liste SELECT, une clause WHERE, une clause HAVING et un GROUP BY. Dans une clause WHERE, CASE permet d'appliquer une logique de filtrage différente selon les valeurs des autres colonnes.

Oui. Placer une expression CASE à l'intérieur de SUM(), COUNT(), ou AVGLa fonction `()` effectue une agrégation conditionnelle, en totalisant ou en comptant uniquement les lignes qui correspondent à chaque condition `WHEN`. Cette technique est souvent utilisée pour créer des rapports de synthèse de type tableau croisé dynamique.

Les fonctions COALESCE et ISNULL ne renvoient que la première valeur non NULL d'une liste. L'expression CASE est plus générale : elle évalue des conditions booléennes ou des correspondances de valeurs arbitraires et renvoie le résultat de la première branche qui est vraie.

Une expression CASE renvoie un seul type de données. SQL Server le détermine à partir de la priorité des types de données de chaque résultat THEN et ELSE ; par conséquent, toutes les branches doivent renvoyer des types compatibles afin d’éviter les erreurs de conversion.

Oui. Une expression CASE peut figurer dans l'instruction SELECT d'une vue et n'importe où dans une procédure stockée, une fonction ou un déclencheur. La syntaxe de cette expression est identique pour tous ces objets.

Oui. Copilote GitHub Il est possible de rédiger des expressions CASE simples et recherchées, y compris des expressions CASE imbriquées et des expressions CASE incluses dans une instruction UPDATE, à partir d'une invite en langage naturel. Il est impératif de toujours vérifier les conditions WHEN, l'ordre des branches et la gestion des clauses ELSE avant d'exécuter la requête.

Les assistants d'IA et d'apprentissage automatique traduisent les règles en langage naturel en expressions CASE simples ou recherchées, suggèrent les branches WHEN manquantes et signalent les chevauchements.ping ou des conditions inaccessibles. Le développeur vérifie chaque suggestion avant de la déployer.

Résumez cet article avec :