Case et when

Case et When

Introduction

Je fais ce tutoriel car j'ai vu qu'il y avait plein de questions à ce sujet et je n'ai pas vu de tutoriels là-dessus sur ce site à moins que je n'ai pas bien vu ou regardé...

Donc j'écris ce tutoriel pour les débutants qui ne savent pas se servir de CASE et WHEN...

Ce tutoriel me servira aussi de référence sur le forum donc si quelque chose n'est pas vrai ou vous choque n'hésitez pas à poster un commentaire, je ne voudrais pas induire les débutants en erreurs !

Qu'est-ce-que c'est ?

CASE est un mot réservé en SQL. En fait, c'est une sorte de boucle qui contient des conditions représentées par le mot réservé WHEN. Si cette condition est vraie, on a un autre mot réservé THEN qui est placé après la condition et après ce mot on a le résultat souhaité...

WHEN représente une condition, et dans une boucle CASE, on peut avoir autant de conditions que l'on veut !

THEN représente le résultat qui doit être retourné si la condition est vraie !

Le fameux ELSE retourne ce qui est placé après lui au cas ou aucune des conditions représentées par les WHEN n'est vraies !

Une boucle CASE se finit toujours par le mot réservé END !

Schéma

Voici comment se présente généralement une boucle CASE :

SELECT france, resultat, CASE
      WHEN 'france' = 3THEN    'La france a marqué 3 buts'
      WHEN 'france' = 0 THEN 'La france a marqué 0 but'
      WHEN 'france' < 5 THEN 'La france a marqué moins de 5 buts'
      WHEN 'france' > 5 THEN 'La france a marqué plus de 5 buts'
      ELSE 'Résultat inconue !'
END AS 'resultat' FROM match;

Dans cet exemple :

  • 'match' est la table qui contient les matchs !
  • 'france' est le champs qui contient le nombre de but(s) qu'a marqué la France
  • 'resultat' est le champ qui va contenir le résultat retourné par par la boucle CASE

Le ORDER BY et le GROUP BY

Suite à la remarque de nhervagault, je rajoute une explication sur l'utilisation très peu connue des CASE et des WHEN avec GROUP BY et ODER BY...

Donc je pense que le plus simple pour vous et pour moi est de vous montrer un exemple et de l'expliquer...

SELECT * FROM table ORDER BY CASE
      WHEN@variable = 1 THEN colone1
      WHEN@variable = 2THEN colone2
      WHEN @variable = 3 THEN colone3
END

C'est exactement pareil pour le GROUP BY...
Dans cet exemple :

  • 'table' est la table utilisée...
  • '@variable' est une variable contenant un nombre...

Et ce qui se trouve derrière le THEN c'est le nom de la colonne avec laquelle on va trier les résultat...

Que va t-il se passer si deux conditions ou plus sont vraies ?

Très bonne question. Si deux conditions ou plus sont vraies, c'est le résultat de la première condition vraie qui sera retourné et on sortira de la boucle. Sinon ce qui est après le ELSE sera retourné !

Ce comportement est le même sous SQL server 2005 et et Mysql, j'ai fais les tests pour mysql et casy s'est chargé des tests sous SQL Server 2005. D'ailleurs, je remercie casy pour sa question sur le forum car elle m'a donné envie de me remettre au SQL, au vrai avec les Procédure stocké, etc...

Si vous pouvez faire des test sur d'autre SGBD ce serait avec plaisir que je rajouterai le comportement ici !

Conclusion

Bonne lecture et ne vous gênez pas pour mettre des commentaires !
Si vous avez des idées pour étendre ce tutoriel, mettez les aussi !

a++

Ce document intitulé « Case et when » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous