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

DB2 Discussion :

CASE POUR UN 'IN'


Sujet :

DB2

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut CASE POUR UN 'IN'
    bonjour à tous,

    j'essai du faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Select * FROM ...
     
    where .... IN ( CASE
     
     
                 WHEN ...... = 'T'  THEN 'TEST'
                 WHEN ...... = 'A'  THEN 'TEST','ACCP'
                 WHEN ...... = 'P'  THEN 'TEST','ACCP','PROD'
     
     
                      ) END
    je ne sais pas si c'est possible et surtout je ne sais pas comment m'y prendre.

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Par défaut CASE POUR UN 'IN'
    Peut être avec cette syntaxe :
    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
     
    SELECT * FROM ...
    WHERE RUB1  IN (          
    CASE RUB2                 
    WHEN 'T' THEN 'TEST'   
    WHEN 'A' THEN 'TEST'   
    WHEN 'P' THEN 'TEST'   
    END,                      
    CASE RUB2                 
    WHEN 'A' THEN 'ACCP'   
    WHEN 'P' THEN 'ACCP'   
    END,                      
    CASE RUB2                 
    WHEN 'P' THEN 'PROD'   
    END )

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Ta demande n'est pas très claire. Ne veux-tu pas plutôt établir la requête suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CASE MaZone 
                    When 'T' Then 'TEST'
                    When 'A' Then 'ACCP'
                    When 'P' Then 'PROD'
                    Else MaZone 
                END
    WHERE MaZone IN ('TEST', 'ACCP', 'PROD')
    Sinon, explique ce que tu veux faire.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    bonjour,

    Non C'est plus dans l'optique de la réponse de battistuta.
    Mais je n'ai pas encore eu le temps d'essayer, ce sera pour lundi.


    merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Merci battistuta !!! ca fonctionne impeccablement.

  6. #6
    Membre expérimenté
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Par défaut
    Bonjour,

    Gaffe aux perfs. Avec la solution du CASE, tu pars en scan de la table. S'il est est volumineuse... Des fois, il faut savoir faire simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM TAB
    WHERE (COL1 = 'X' AND COL2 = 0)
    OR (COL1 = 'Y' AND COL2 = 1)
    OR (COL1 = 'Z' AND COL2 = 2)
    OR ...
    Ou alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM TAB
    WHERE (COL1, COL2) = ('X', 0)
    OR (COL1, COL2) = ('Y', 1)
    OR (COL1, COL2) = ('Z', 2)
    OR...
    Avec ces 2 écritures, s'il existe un index sur COL1 ou COL2, voire les 2 colonnes, DB2 se servira de cet index en Multiple Access Index, tu n'auras donc aucun souci de perf.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Par défaut CASE POUR UN 'IN'
    Bien vu le montagnard
    Sur des rubriques indexés et une table volumineuse, on a tout à gagner avec un bon vieux OR...

  8. #8
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Bonjour

    Juste une remarque.
    En utilisant le OR, il y a des chances d'avoir un TableScan.
    Et plus il y a de OR, plus la probabilité d'avoir un TableScan augmente.

  9. #9
    Membre expérimenté
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Par défaut
    Tout à fait d'accord avec Bernard59139, le OR est souvent mal interprété par DB2 en terme de chemins d'accès. Ceci dit, avec le CASE, le scan est une certitude. Avec le OR, on a des chances d'être OK.

    J'ai fait 2 ou 3 essais tout à l'heure sur une table de plusieurs millions de lignes avec une dizaine de OR : réponse dans la seconde. Avec le CASE, réponse en plusieurs minutes...

    Y'a pas photo !

    Je profite du message pour passer le bonjour à l'homme du sud alias Battistuta. Préviens si tu viens dans la région, on a beau dire, le ski c'est quand même plus de sensations que DB2...

  10. #10
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Bonjour

    Je viens de lire la doc. Le " col1 IN (CASE ...." n'est ni indexable, ni stage 1.
    ==> le tablescan sera très consommateur de ressources.

    A l'inverse, la même requête avec des "OR" bien codés, sera STAGE1, même si les index ne sont pas utilisés.

  11. #11
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    Le OR fait diminuer le nombre de matchcols s'il porte sur une/des colonnes indexables si je ne m'abuse (tout comme un BETWEEN)

    .

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Citation Envoyé par pdz74 Voir le message
    Tout à fait d'accord avec Bernard59139, le OR est souvent mal interprété par DB2 en terme de chemins d'accès. Ceci dit, avec le CASE, le scan est une certitude. Avec le OR, on a des chances d'être OK.
    Pourquoi mal interprété ?

    Db2 ne fera de scan table que s'il estime que les clauses OR vont permettre de ramener plus de 20% des lignes de la table en question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [UML] Use Case pour une 'commande'
    Par _Kiro dans le forum Cas d'utilisation
    Réponses: 15
    Dernier message: 21/11/2006, 23h46
  2. Réponses: 8
    Dernier message: 18/11/2006, 22h06
  3. problème formulaire précocher des cases pour modif
    Par Skeud007 dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2006, 21h58
  4. Select case pour afficher un Etat selon un critère
    Par Sofie109 dans le forum Access
    Réponses: 4
    Dernier message: 06/09/2006, 16h31
  5. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20

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