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

SQL Oracle Discussion :

Liste de valeurs pour un critère


Sujet :

SQL Oracle

  1. #1
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut Liste de valeurs pour un critère
    Bonjour,

    J'ai une requete type que j'utilise sur DB2 et PostgreSQL mais que je ne parviens pas à adapter à Oracle (sachant que j'ai un générateur de requete qui me crée la requête en fonction de la base requêtée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COL3, COL4
    FROM TAB1
    WHERE (COL1, COL2) IN ( VALUES ( 1235, 'ABC' ), (35542, 'DF') )
    Je cherche donc les lignes de TAB1 avec les couples de valeurs mentionnés, sachant que je peux aussi bien avoir 2 couples de valeurs que 50

    Pour Oracle, j'en suis arrivé à faire ça (C'est peut-être une grosse connerie, alors dites le tout de suite si c'est le cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COL3, COL4
    FROM TAB1
    WHERE (COL1, COL2) IN ( (SELECT 1235, 'ABC' FROM DUAL) UNION (SELECT 35542, 'DF' FROM DUAL) )
    Biensur ça ne marche pas : ca ne fait pas d'erreur, mais retourne 0 ligne
    J'ai remarqué que si je mets 'ABC' et 'DF ' (les 2 chaines paddées sur la même longueur) alors ça marche !
    Vous n'auriez pas une meilleur solution que de padder les chaines de caractère ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COL3, COL4
    FROM TAB1
    WHERE (COL1, COL2) IN ( ( 1235, 'ABC' ), (35542, 'DF') )
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Décidément, j'en suis arrivé à un point ou je n'arrive même plus a imaginer des solutions simples ....
    Merci beaucoup

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par gRRosminet Voir le message
    Vous n'auriez pas une meilleur solution que de padder les chaines de caractère ?
    C'est bien une question de contenu de colonne.
    Si dans votre colonne vous avez 'DF ', c'est bien différent de 'DF', en tout cas dans un varchar2. Dans un char, c'est similaire, puisque le contenu de la colonne est automatiquement padée à la plus grande longueur :
    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
    create table TAB1 (t_id number(1), t_vchr2 varchar2(3), t_chr char(3));
     
    insert into tab1 (t_id, t_vchr2, t_chr) values (1, 'DF' , 'DF' );
    insert into tab1 (t_id, t_vchr2, t_chr) values (2, 'DF ', 'DF ');
     
    select 'DF-VC2' as tst, t_id, t_vchr2 || '*' as t_vchr2, t_chr || '*' as t_chr from tab1 where t_vchr2 = 'DF'  union all
    select 'DF-CHR'       , t_id, t_vchr2 || '*'           , t_chr || '*'          from tab1 where t_chr   = 'DF'  union all
    select 'DF -VC2'      , t_id, t_vchr2 || '*'           , t_chr || '*'          from tab1 where t_vchr2 = 'DF ' union all
    select 'DF -CHR'      , t_id, t_vchr2 || '*'           , t_chr || '*'          from tab1 where t_chr   = 'DF ';
     
    TST     T_ID T_VCHR2 T_CHR
    ------- ---- ------- -----
    DF-VC2     1 DF*     DF *
    DF-CHR     1 DF*     DF *
    DF-CHR     2 DF *    DF *
    DF -VC2    2 DF *    DF *
    DF -CHR    1 DF*     DF *
    DF -CHR    2 DF *    DF *

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    En fait je n'ai pas été tout a fait clair dans mon explication :

    Dans mon cas de test, en fait ma table n'avait aucune ligne qui corresponde au couple (35542, 'DF'), mais uniquement des lignes qui correspondent au critère (1235, 'ABC').

    si je faisais le critère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IN ( (SELECT 1235, 'ABC' FROM DUAL) UNION (SELECT 35542, 'DF' FROM DUAL) )
    => Aucune ligne

    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IN ( (SELECT 1235, 'ABC' FROM DUAL) UNION (SELECT 35542, 'DF ' FROM DUAL) )
    => Renvoie bien mes lignes correspondant au couple (1235, 'ABC')

    Heureusement il y a al1_24 qui me simplifie la vie

    Bienvenue dans le monde merveilleux d'oracle

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Désolé mais ce que vous dites n'est pas cohérent.
    Je garde la table tab1 créé ci-haut :
    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
    insert into tab1 (t_id, t_vchr2) values (3, 'ABC');
    -- 1 row(s) inserted.
     
    select t_id, t_vchr2
      from tab1
     where (t_id, t_vchr2) in ((3, 'ABC'), (4, 'DEF'));
     
    T_ID T_VCHR2
    ---- -------
       3 ABC
     
    select t_id, t_vchr2
      from tab1
     where (t_id, t_vchr2) in ((select 3, 'ABC' from dual) union (select 4, 'DEF' from dual));
     
    T_ID T_VCHR2
    ---- -------
       3 ABC
    Le fait que le couple (4, 'DEF') n'existe pas dans ma table n'a aucune influence sur le couple (3, 'ABC'), c'est bien l'intérêt du IN.

  7. #7
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Attention, c'est 'DF' qui pose probleme dans l'exemple ci dessus, pas 'DEF' (qui lui ne poserai pas problèmes !!!) ==> parceque 'DF' et 'ABC' ne font pas la même longueur

    Cependant, si on exécute que la sous-requête qui est dans le IN, il sort bien le résultat attendu !

    --

    J'ai essayé de refaire un jeu de test et .... ben j'arrive plus a reproduire le phénomène Je n'y comprends plus rien
    Merci quand même d'avoir passé du temps sur ce (non-)problème

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/08/2015, 12h00
  2. Réponses: 0
    Dernier message: 08/06/2011, 13h45
  3. [AC-2007] Liste déroulante ayant pour critère une autre valeur de la requete
    Par yoyo1664 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/03/2011, 08h41
  4. [BO 5.1.6] : liste de valeurs pour des invites
    Par miketidy dans le forum Débuter
    Réponses: 5
    Dernier message: 23/12/2009, 10h33
  5. Liste de valeurs pour un champ parametré
    Par IceKill dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 16/12/2008, 18h54

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