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 :

CASE WHEN avec un comportement anormal


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut CASE WHEN avec un comportement anormal
    Bonjour,
    Je suis sous Oracle 9i, j'ai un problème assez étrange avec un case.
    Voici le genre de requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ZONE
    FROM TAB
    WHERE ZONE = 'TOTO'
    AND CASE WHEN ZONE in ('ALL', 'TATA') THEN 1
                   WHEN 'ALL' = 'ALL' THEN 1
                   ELSE 0
          END = 1
    Cette requête ne devrait pas m'afficher de ZONE différente de 'TOTO' et pourtant c'est bien ce qu'elle fait, 'TATA' par exemple.

    Parmi mes recherches :
    Cette valeur peux changer après un refresh des stats de ma Base.
    Si je ne met qu'une seule valeur dans le IN les résultats sont corrects,
    De même si je met trois valeurs.....

    dam

    EDIT par bouyao

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Chez moi rien à signaler tout marche bien pour une requête équivalente.

    Regarde avec des parenthèses si ça ne règle pas le problème.

    Et le 'ALL'='ALL', j'espère que c'est pour la démo ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En fait le ALL = ALL n'est pas de la démo.

    Cette requête me permet de gérer la visibilité des données de mon application, normalement il s'agit plutôt de variables dont la valeur vaut 'ALL', si mon user accès à tout.

    J'ai essayé les parenthèses sans succès.
    Je crois que je vais devoir chercher un exorciste Oracle.

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Etrange... Chez moi cela fonctionne :
    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
    SQL> select * from tab;
    ZONE
    ------------------------------
    TATA
    TOTO
    ALL
     
    3 rows selected.
     
    SQL> select zone from tab where zone = 'TOTO' and case when zone in ('ALL', 'TATA') then 1
      2  when 'ALL' = 'ALL' then 1 else 0 end = 1;
    ZONE
    ------------------------------
    TOTO
     
    1 row selected.
    Es-tu sûr que c'est exactement cette requête qui est exécutée ?
    Que donne son équivalent avec decode ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select zone 
    from tab 
    where zone = 'TOTO' 
      and decode (zone, 'ALL', 1, 'TATA', 1, decode ('ALL', 'ALL', 1, 0)) = 1;

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Des précisions
    Voici la requête exacte :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    SELECT t7846.x_tp_veh_name AS c2,
           t7846.x_tp_cbu_name AS c3,
           t7846.x_tp_vfv_fit_set_name AS c4,
           t7337.x_tp_export_flg AS c5,
           t7337.x_tp_sal_loc AS c6,
           t9875.dataset AS c7,
           t7518.x_tp_exp_vfv_wid AS c9,
           t7518.dataset AS c10,
           t7337.x_tp_market_rate AS c11,
           t7518.x_tp_vfv_qty AS c12
    FROM   ((SELECT row_id dataset,
                    x_tp_start_year,
                    x_tp_end_year
             FROM   wx_plan_d
             WHERE  x_tp_error = 'Plan succesfully created'
             UNION ALL
             SELECT 'Live Data' dataset,
                    TO_NUMBER (NULL) x_tp_start_year,
                    TO_NUMBER (NULL) x_tp_end_year
             FROM   DUAL)) t9875,
           wx_plan_exp_d t7337,
           wx_plan_veh_f t7518,
           wx_plan_veh_d t7846,
           wx_plan_seg_d t7454
    WHERE  (    t7337.x_tp_vfv_wid = t7518.x_tp_veh_d_wid
            AND t7337.dataset = t7518.dataset
            AND t7518.dataset = t9875.dataset
            AND t7518.x_tp_veh_d_wid = t7846.row_wid
            AND t7518.dataset = t7846.dataset
            AND t7454.x_tp_vfv_wid = t7846.row_wid
            AND t7454.dataset = t7846.dataset
            AND CASE
                   WHEN t7846.x_tp_zone = 'ALL' THEN 1
                   WHEN 'ALL' = 'ALL' THEN 1
                   WHEN t7846.x_tp_cbu_name IN ('BMW', 'NO_DATA') THEN 1
                   WHEN t7846.x_tp_zone_cbu IN ('BMW_TCAO', 'BMW_TCOA', 'BMW_TCOE', 'NO_DATA') THEN 1
                   WHEN t7846.x_tp_zone_cntry = 'NO_DATA' THEN 1
                   WHEN t7846.x_tp_cbu_cntry = 'NO_DATA' THEN 1
                   WHEN t7846.x_tp_zone_cbu_cntry = 'NO_DATA' THEN 1
                   ELSE 0
                END = 1
            AND t7846.x_tp_level = 'Fitted Version'
            AND t7846.x_tp_veh_name = 'DSAN'
            AND t7846.x_tp_cbu_name = 'HON'
            AND t7518.dataset = 'Live Data'
            AND t9875.dataset = 'Live Data'
           )
    La ligne qui semble poser le problème est celle qui est en gras.
    L'outil qui me génère ces requêtes choisi de mettre un = s'il n'y a qu'une seule valeur ou un IN s'il y a plusieurs valeurs, dans mon cas, la requête renvoie un résultat satisfaisant s'il y a plus de deux valeurs dans le IN.

    Ci-dessous un extrait des données renvoyées par la requête on voit bien que la valeur du champs C3 est incorrecte à cause de la restriction indiquée en rouge
    C2 C3 C4 C5 C6 C7 C9 C10 C11 C12

    DSAN TOY 2_2 Y 508 Live Data 6148 Live Data 20 0
    DSAN TOY 2_2 Y 520 Live Data 6148 Live Data 40 0
    DSAN TOY 2_2 Y 700 Live Data 6148 Live Data 20 0
    DSAN TOY 2_2 N ZPA Live Data 6148 Live Data 20 0
    DSAN TOY 2_2 Y 508 Live Data 6148 Live Data 20 0
    DSAN TOY 2_2 Y 520 Live Data 6148 Live Data 40 0
    DSAN TOY 2_2 Y 700 Live Data 6148 Live Data 20 0
    EDIT par bouyao

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut

Discussions similaires

  1. CASE WHEN avec hibernate
    Par kinshinori dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/06/2010, 10h54
  2. CASE WHEN avec opérateur IN
    Par bossun dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/12/2009, 15h32
  3. Utilisation CASE WHEN avec une liste de valeurs
    Par mortimer.pw dans le forum PL/SQL
    Réponses: 5
    Dernier message: 26/03/2009, 12h50
  4. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  5. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58

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