begin process at 2013 06 19 00:17:25
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Divers

 > CASE ET WHEN

CASE ET WHEN


 Information sur le tutoriel

Note :
Aucune 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++

 Historique

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...

Commentaires

Commentaire de nicomilville le 29/06/2008 12:00:29

Pas de commentaires ?

a++

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.

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 ?

Commentaire de crn_c21 le 31/07/2008 22:51:50

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

Commentaire de nicomilville le 01/08/2008 08:53:39

Merci CRN_c21 !

Ok je vais rajouter la notion du else...

a++

Commentaire de nicomilville le 12/08/2008 14:18:44

Voila, c'est fait !

a++

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


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...

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++

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.


Commentaire de nicomilville le 09/09/2008 21:03:10

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

a++

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++

Commentaire de lycanges le 20/01/2009 15:07:46

Bon tutorial, on comprend rapidement sans avoir a se faire de noeux au cerveau.

Commentaire de dk5888 le 05/11/2009 14:42:38

Pour compléter aussi on peut écrire la requête suivante d'une autre façon :

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

V2 :
SELECT * FROM table ORDER BY
CASE @variable
      WHEN 1 THEN colone1
      WHEN 2 THEN colone2
      WHEN 3 THEN colone3
-- Facultatif : ELSE coloneAutre
END

Par contre la v2 ne fonctionne pas du tout avec des > ou <

Commentaire de noutchamichel le 16/11/2012 22:48:20

vraiment merci pour cet remise a niveau vous faites vraiment du bon boulot

Commentaire de noutchamichel le 16/11/2012 22:52:26

est ce que la clause ORDER BY n'est pas la dernier instruction dans une requette SELECT ?

ok cool je vois dans cet exemple il ya un choix ! que se gegnial
merci

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,312 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales