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 WHEN EXISTS impossible dans un SELECT ?


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut CASE WHEN EXISTS impossible dans un SELECT ?
    Bonjour à tous,

    Je cherche à faire une sélection du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Colonne1,
    CASE WHEN EXISTS 
    (SELECT Colonne2 FROM Ma_Table2 
    WHERE Colonne1 = Colonne2) 
    THEN 0 ELSE 1 END AS resultat
    FROM Ma_Table1
    Sauriez-vous cette syntaxe est possible sous DB2 ? Je n'ai rien trouvé sur boulder et j'ai essayé plein de variations mais je me fais jetter à chaque essai...

    Je ne cherche pas à faire exactement ce qui est donné en exemple mais plus à valider la bonne syntaxe.

    En vous remerciant,

    C. Tobini

  2. #2
    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
    Bonsoir,

    Vu l'heure (...), je suis loin de toute doc. Mais, en effet, je crois qu'une sous-requête dans un CASE, ce n'est pas possible. Ceci dit, ce que tu souhaites, c'est sélectionner toutes les lignes de table1 + une expression qui serait égale à 0 si la ligne est également présente dans table2, à 1 sinon. Tu peux résoudre cela par une jointure externe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT Colonne1,
    CASE
       WHEN Colonne2 = Colonne1 THEN 0
       ELSE 1
    END AS resultat
    FROM Ma_Table1
    LEFT JOIN Ma_Table2
    ON Colonne1 = Colonne2
    Au cas où plusieurs lignes possible dans table2, tu ajoutes un DISTINCT que j'ai mis en italique, sinon tu peux l'enlever.

    Bonne utilisation et bon week.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Bonjour,

    J'écrirai quasiment la même chose que la requête de départ :

    SELECT Colonne1,
    value((SELECT max(0) FROM Ma_Table2 WHERE Colonne1 = Colonne2), 1)
    AS resultat
    FROM Ma_Table1

    S'il y a quelques chose dans table 2 résultat vaut max(0) = 0 sinon résultat vaut NULL et sera remplacé par 1

  4. #4
    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
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Colonne1,
    value((SELECT max(0) FROM Ma_Table2 WHERE Colonne1 = Colonne2), 1)
    AS resultat
    FROM Ma_Table1
    non, non et non.

    Ceci est une requête scallaire => performance horrible mais alors vraiment horrible.

    Avec une tel requête le SGBD va d'abord rechercher toutes les lignes de ma_table1 ensuite pour chaque ligne résultat il va effectuer la sous-requête.

    Le seul cas où ce type de requête est envisageable sera :
    - la requête primaire retourne très peu de ligne (mais vraiment très peu)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Par défaut
    Bonjour et merci de vos réponses, je ne comprends pas la fonction de MAX(0), ne renvoie t'elle une valeur qu'en cas de correspondance dans le JOIN ?

  6. #6
    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
    oui, mais c'est pas le problème.

    Le problème c'est la structure de cette requête qu'il faut totalement proscrire tant que vous ne comprenez pas les mécanismes de base d'un sgbd.

Discussions similaires

  1. [2012] Max(date) dans select case when
    Par varik dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 05/08/2014, 15h00
  2. Réponses: 4
    Dernier message: 20/11/2012, 12h54
  3. CASE WHEN EXISTS avec plusieurs colonne
    Par LOPEZ dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/10/2011, 11h43
  4. Access et SELECT CASE WHEN dans requetes
    Par Orion01 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/12/2007, 11h24
  5. Réponses: 7
    Dernier message: 29/05/2007, 10h21

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