IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Pb : Case When


Sujet :

Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    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

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    alors il faut autant de CASE WHEN que d'occurences ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    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'.

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 , [...]

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    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

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    Je vous remercie pour les idées que vous m'avez donné, je teste demain, et je vous tiens au courant.
    Bonne soirée

  9. #9
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,
    le résultat souhaité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RepartitionPersonne valeur
    HommeAdulte 2
    HommeChNoir 1
    TotalHomme 5
    Essaie ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/10/2005, 13h25
  2. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58
  3. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20
  4. Structure CASE WHEN en Interbase
    Par tchaman dans le forum InterBase
    Réponses: 8
    Dernier message: 13/12/2004, 16h18
  5. [SQL] performances Decode ou Case when ?
    Par Yorglaa dans le forum Oracle
    Réponses: 8
    Dernier message: 01/10/2004, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo