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

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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 actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    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
    Points : 6
    Points
    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 : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    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 régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    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 : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    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.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Oui j'ai bien vu qu'il y a un produit cartésien et le but n'est pas de mettre le SGBD à genoux. Je ne compte pas appliquer cette solution, par contre j'aime bien savoir ce que la personne proposant la solution a en tête puisque nous sommes ici pour échanger

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Pour répondre à ta question, un SELECT MAX renvoie NULL si aucune ligne renvoyée. Donc, en effet, si pas de correspondance dans la table, MAX(0) renverra NULL. Pour répondre à la fonction VALUE, DB2 passe à la 2ème expression, cad la constante 1. Donc DB2 renvoie 1.

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