Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/03/2007, 19h17   #1
Invité de passage
 
Inscription : avril 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 8
Points : 0
Points : 0
Par défaut Pb : Case When

Salut à tous, je travaille sous Oracle depuis quelques mois, et j'ai besoin d'aide.
Voilà mon problème: dans une application, j'utilise le "case when" avec plusieurs when dans le case, et chacun utilisant plusieurs variables. Je me suis rendu compte qu'à la fin d'un when, il y avait un break implicite et que le traitement du case se terminait.
Or, j'aurai besoin que tous les when du case soient parcourus.
Est ce qu'il existe un moyen (dans le genre du case) pour faire ce que je veux?

Merci d'avance
Virginie
vir8888 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2007, 20h00   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

A ma connaissance on n'a pas besoin d'un break dans un select case c'est a dire s'il vérifie la condition du when il va éxecuter la clause then sinon il va éxecuter la partie sinon, comme vous pouvez le voir dans l'exemple ci-dessous

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE TABLE test_case_when (
  a varchar2(5),
  b varchar2(5)
);
 
INSERT INTO test_case_when VALUES ('*','*');
INSERT INTO test_case_when VALUES ('+','+');
INSERT INTO test_case_when VALUES ('-','-');
INSERT INTO test_case_when VALUES ('.','.');
 
SELECT a, 
  case
    when b = '*' then 'star'
    when b = '+' then 'plus'
    when b = '-' then 'minus' 
    else '????'
  end 
FROM test_case_when;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 22h02   #3
Invité de passage
 
Inscription : avril 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 8
Points : 0
Points : 0
Bonjour,
je pense qu'un petit exemple sera plus explicite que mes explications.
Imaginons une table 'PERSONNE' avec comme proprietes:
- civilite ('M' ou 'Mme')
- adulte (0 ou 1)
-couleur des cheveux ('NOIR', 'BLOND', 'ROUX')
(c'est simplifié à l'extreme)
Dans mon traitement, je fait un truc du genre:



select[...]
case when civilite='M' and adulte=1 then 'HommeAdulte'
when civilite='M' and cheveux='NOIR' then 'HommeChNoir'
when civilite='M' then 'TotalHomme'
end RepartitionPersonne, [...]

Si je fais ce traitement, et qu'une personne correspond au premier when, elle ne sera pas prise en compte dans mon total, car une condition sera vérifiée, le then sera aplliqué et se sera la fait du case.
Or, je cherche quelque chose qui me permette de faire tous les when, pour poouvoir vérifier, le cas echeant, toutes les conditions.

J'espère avoir été un peu plus précise sur mon pb, et ce que je cherche.
vir8888 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 22h56   #4
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
alors il faut autant de CASE WHEN que d'occurences ?
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 23h02   #5
Invité de passage
 
Inscription : avril 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 8
Points : 0
Points : 0
Je ne sais pas, j'y ai bien pensée, mais je ne sais pas si ça correspond avec ce que je veux, parce qu'il faut que, pour reprendre l'exemple, 'HommeAdulte', 'HommeChNoir', et 'TotalHomme' soient dans la meme colonne 'RepartitionPersonne', et j'ai peur, en mettant plusieurs case when, qu'il y ait plusieurs colonnes 'RepartitionPersonne'.
vir8888 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 23h05   #6
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour ,

Donc si j'ai bien compris tu n'as pas besoin de mettre le tout dans un case, alors il faut eclater ce dernier
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
SELECT[...]
case when civilite='M' AND adulte=1 then 'HommeAdulte'
else NULL
end   case adulte,
case
when civilite='M' AND cheveux='NOIR' then 'HommeChNoir'
else NULL
end case cheveux_noir,
case 
when civilite='M' then 'TotalHomme'
end , [...]
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 23h21   #7
Invité de passage
 
Inscription : avril 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 8
Points : 0
Points : 0
Voici l'exemple complété:
select[...],
case when civilite='M' and adulte=1 then 'HommeAdulte'
when civilite='M' and cheveux='NOIR' then 'HommeChNoir'
when civilite='M' then 'TotalHomme'
end RepartitionPersonne,
count(*) valeur
from PERSONNE, d'autres tables
Where ...
UNION
SELECT
[...],
'HommeAdulte' Repartition Personne,
valeur
from PERSONNE, d'autres tables
Where ...
UNION
Where ...
UNION
SELECT
[...],
'HommeChNoir' Repartition Personne,
valeur
from PERSONNE, d'autres tables
Where ...
UNION
SELECT
[...],
'TotalHomme' Repartition Personne,
valeur
from PERSONNE, d'autres tables
Where ...

Donc, je vais avoir:

RepartitionPersonne valeur
HommeAdulte 2
HommeChNoir 1
TotalHomme 5

Je pourrai faire plusieurs case en leurs donnant plusieurs noms, et appeler l'un puis l'autre, mais une partie du code est généré en java, en appelant toujours la meme fonction
vir8888 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 23h38   #8
Invité de passage
 
Inscription : avril 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 8
Points : 0
Points : 0
Je vous remercie pour les idées que vous m'avez donné, je teste demain, et je vous tiens au courant.
Bonne soirée
vir8888 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 23h40   #9
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,
le résultat souhaité
Code :
1
2
3
4
5
 
RepartitionPersonne valeur
HommeAdulte 2
HommeChNoir 1
TotalHomme 5
Essaie ce code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT pers.ha RepartitionPersonne ,pers.nb valeur
FROM (
SELECT 'HommeAdulte' ha, count(*) nb 
FROM personne 
WHERE civilite='M' AND adulte=1 
GROUP BY ha
union 
SELECT 'HommeChNoir' hcn , count(*)
FROM personne 
WHERE civilite='M' AND cheveux='NOIR' 
GROUP BY hcn
union
SELECT 'TotalHomme' th, count(*)
FROM personne 
WHERE civilite='M' 
GROUP BY th) pers
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h48.


 
 
 
 
Partenaires

Hébergement Web