Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CASE ET WHEN


Information sur le tutorial

Catégorie :Divers Date de création : 28/06/2008 13:00:10 Vu : 1 996 fois

Note :
Aucune note

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note


Description

Salut,

Je fais ce tutorial car j'ai vu qu'il y avait plein de question a ce sujet et je n'ai pas vu de tutoriaux la dessus sur ce site a moins que je n'ai pas bien vu ou regardé...

Donc je fais ce tutorial pour les débutants que ne savent pas se servir de CASE et WHEN...

Ce tutorial 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 a poster un commentaire, je ne voudrai pas induire les débutants en erreurs !

a++

PS : Désolé pour les fautes d'orthographe

Tutorial

CASE et WHEN

Introduction :

Je fais ce tutorial car j'ai vu qu'il y avait plein de question a ce sujet et je n'ai pas vu de tutoriaux la dessus sur ce site a moins que je n'ai pas bien vu ou regardé...

Donc je fais ce tutorial pour les débutants que ne savent pas se servir de CASE et WHEN...

Ce tutorial 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 a poster un commentaire, je ne voudrai pas induire les débutants en erreurs !

Qu'est-ce-que c'est ?

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

Cette boucle ne s'arête que lorsqu'une condition est vrai et dans ce cas si une condition est vrai ou quand elle est arrivé a la fin sans trouvé des condition vrai !

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

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

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

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

Shé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 champs qui va contenir le résultat retourné par par la boucle
CASE

Le ORDER BY et le GROUP BY :

Suite a la remarque de nhervagault je rajoute une explication sur l'utilisation très peut connu des CASE et des WHEN avec GROUP BY et ORDER 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 colone avec laquelle on va trier les résultat...

Que va t-il se passer si deux condition ou plus sont vrai ?

Très bonne question, si deux condition ou plus sont vrai c'est le résutat de la première condition vrai 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 test pour mysql et casy s'est chargé des tests sous SQL server 2005, d'ailleur 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 serai 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 tutorial, metez les aussi !

a++

12 août 2008 14:17:54 :
Ajout de la notion du else...
13 septembre 2008 13:02:23 :
Ajout d'explication sur l'utilisation d'un CASE dans les clause ORDER BY et GROUP BY...
signaler à un administrateur
Commentaire de nicomilville le 29/06/2008 12:00:29

Pas de commentaires ?

a++

signaler à un administrateur
Commentaire de casy le 29/06/2008 18:21:43

ah ben tiens, je tombe totalement par hasard sur ce tuto et voila que l'on parle de moi.

signaler à un administrateur
Commentaire de nicomilville le 29/06/2008 18:43:57

lol, oui, j'ai fais ce tutorial suite a ta question et je compte bien en faire d'autres !

a++

PS : que pense tu de ce tuto ?

signaler à un administrateur
Commentaire de crn_c21 le 31/07/2008 22:51:50

Bon tutorial! Manque peut-être la notion du ELSE

signaler à un administrateur
Commentaire de nicomilville le 01/08/2008 08:53:39

Merci CRN_c21 !

Ok je vais rajouter la notion du else...

a++

signaler à un administrateur
Commentaire de nicomilville le 12/08/2008 14:18:44

Voila, c'est fait !

a++

signaler à un administrateur
Commentaire de nhervagault le 07/09/2008 15:45:37 administrateur CS

Bon tutoriel,

Mais on peut rajouter les case sur les "group by" et les "order by" sur sql server, cette notion est très peu connue mais permet d'éviter de faire des requêtes dynamiques parfois.

Voici quelques exemples pour compléter le tutoriel.


--exemple basé sur une base pubs sur sqlserver

DECLARE @crit varchar (50)

--Colonne de tri
SET @crit = 'stor_name'
--SET @crit = 'city'



-- exemple 1 : tri conditionnel simple
SELECT *
FROM stores
ORDER BY
CASE WHEN @crit = 'city' THEN city  ELSE stor_name END


--exemple 2 : tri conditionnel avec group by
--quantite par ville ou par magasin en fonction de @crit
SELECT CASE WHEN @crit = 'city' THEN city  ELSE stor_name END, sum(qty)
FROM stores
INNER JOIN  dbo.sales
ON sales.stor_id = stores.stor_id
GROUP BY
CASE WHEN @crit = 'city' THEN city  ELSE stor_name END
ORDER BY
CASE WHEN @crit = 'city' THEN city  ELSE stor_name END


--exemple 3 tri conditionnel
--multi critere
declare @tri int
set @tri = 4

--utilisation d'opération binaire
--1 --> tri sur state
--2 --> tri sur city
--3 --> tri sur state puis city
--4 --> tri sur stor_name
--5 --> tri sur state puis stor_name
--6 --> tri sur city puis stor_name
--7--> tri sur state puiq city puis stor_name

--pour un nouveau champs prendre un nombre 2n (soit pour les suivant 8, 16, 32, ....)

SELECT stor_name,city, sum(qty)
FROM stores
INNER JOIN  dbo.sales
ON sales.stor_id = stores.stor_id
GROUP BY stor_name,city,
CASE WHEN @tri & 1 = 1 THEN [state]  END,
CASE WHEN @tri & 2 = 2 THEN city END,
CASE WHEN @tri & 4 = 4 THEN stor_name END
ORDER BY
CASE WHEN @tri & 1 = 1 THEN [state]  END,
CASE WHEN @tri & 2 = 2 THEN city END,
CASE WHEN @tri & 4 = 4 THEN stor_name END


signaler à un administrateur
Commentaire de nicomilville le 07/09/2008 15:49:56

Merci, je vais essayer de rajouter ça en prenant compte de ton exemple mais comme je ne connait pas encore très bien SQL Server, je ne connaissais pas cette possibilité...

a++

PS : merci du commentaire...

signaler à un administrateur
Commentaire de nicomilville le 07/09/2008 15:51:18

Mais y a un truc que je comprend pas, tu fais plusieur case (1 when par case, pourquoi ne pas en mettre plusieurs ?)...

a++

signaler à un administrateur
Commentaire de nhervagault le 09/09/2008 20:02:29 administrateur CS

Effectivement
on peut réduire la 3ieme requête à :

SELECT stor_name,city, sum(qty)
FROM stores
INNER JOIN  dbo.sales
ON sales.stor_id = stores.stor_id
GROUP BY
CASE WHEN @tri & 1 = 1 THEN [state]  
WHEN @tri & 2 = 2 THEN city
WHEN @tri & 4 = 4 THEN stor_name END,
stor_name,city
ORDER BY
CASE WHEN @tri & 1 = 1 THEN [state]  
WHEN @tri & 2 = 2 THEN city
WHEN @tri & 4 = 4 THEN stor_name END

Je n'avais pas vu la simplification dans mes tests.

C'est normal que tu ne connais pas cette syntaxe.
Je l'ai même pas vu dans la MSDN ou dans les bouquins.
Je l'ai vu que dans le SELECT sur MSDN (ce qui est présent dans ton tutoriel)

NB : la clause du group by était légerement fausse
il faut déplacer stor_name,city à la fin du group by pour qu'ils interviennent en dernier ainsi ils permettent l'affichage des colonnes stor_name,city  sans avoir d'incidence sur l'ordre du group by.


signaler à un administrateur
Commentaire de nicomilville le 09/09/2008 21:03:10

ok, merci, je rajoute ça demain soir...

a++

signaler à un administrateur
Commentaire de nicomilville le 13/09/2008 13:04:13

Excusez moi du retard mais je ne m'attendais pas a avoir autant de devoirs en troisième...

Donc je viens de rajouter l'explication...

a++

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.