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 :

Condition IN sur une seule ligne, possible ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 65
    Points
    65
    Par défaut Condition IN sur une seule ligne, possible ?
    Bonjour,

    J'utilise un progiciel qui génère une requête SQL automatiquement.
    Je peux juste contrôler la clause WHERE.
    Il n'est donc pas possible de faire du PL/SQL.
    Dans cette clause WHERE, je souhaite filtrer dynamiquement sur un champ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table1.champ1 in (select table2 where...)
    Le "select table2 where" retourne une 1 seule ligne qui est chaine de caractères de type :
    'A','B','C'

    Je pensais que l'on se retrouverait donc avec une requête de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table1.champ1 in ('A','B','C')
    mais ça ne marche pas.Ca ne me retourne rien alors que j'ai des données en base.

    On est obligé de dupliquer la ligne de la table2 autant de fois qu'il y a de cas (ie A, B, C ...) pour que le IN s'exécute bien ?
    Il n'y a pas la possibilité d'avoir la clause In dans un seul champ (comme dans mon exemple) ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Quel SGBD ?

    Il faut faire un SPLIT sur votre chaîne pour la transformer en série de lignes.

    Soit avec une requête récursive à grand coups de substring, soit avec une PS qui retourne une variable table, soit par une méthode d'extension du SGBD comme le CLR avec SQL Server :
    http://www.developpez.net/forums/d14...r/#post7927380

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 257
    Points : 12 920
    Points
    12 920
    Par défaut
    Bonjour,
    A ma connaissance ce n'est pas possible car IN attend une liste de valeur, or ta sous-requête ne renvoie qu'une chaine de caractères, quand bien même celle-ci contient des virgules, des cotes...
    C'est typiquement le genre de problèmes qu'on a en mettant plusieurs valeurs dans une seule colonne de table...

    Tatayo.

  4. #4
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    je confirme l'explication de Tatayo. En revanche, il reste possible de traiter ce cas de figure. En passant par un LIKE.
    Je ne connais pas votre SGBD mais en considérant que la concaténation s'y réalise via la fonction CONCAT, cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (select table2 where...) LIKE CONCAT('%''', table1.champ1, '''%')
    J'ai repris votre notation "(select table2 where...)" pour exprimer la sous-requête. Il est bien entendu qu'il faut que celle-ci ne renvoie qu'une seule ligne.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    C'est quoi cette syntaxe ? select table au lieu de select colonne from table

  6. #6
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est quoi cette syntaxe ? select table au lieu de select colonne from table
    C'est la nouvelle norme SQL ISO 2045

  7. #7
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est quoi cette syntaxe ? select table au lieu de select colonne from table
    Comme je l'indiquais, j'ai repris la syntaxe de blackstrobe et ce, afin qu'il retrouve plus facilement ses petits dans la solution que je lui proposais. De son côté, je suppose que c'est juste un raccourci de langage qu'il a employé.

  8. #8
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 65
    Points
    65
    Par défaut
    table1 et table2 sont des alias (pas nommés judicieusement... )

    Sinon merci à tous pour vos réponses !
    Ca m'a donné des pistes pour trouver ma réponse.

    Voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
     connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Essayez de remplacer votre CONNECT BY (propriétaire Oracle, pas standard du tout) par une CTE récursive.
    A détail de la regexp qui est proprio aussi, vous aurez un code déjà plus portable.

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Essayez de remplacer votre CONNECT BY (propriétaire Oracle, pas standard du tout) par une CTE récursive.
    A détail de la regexp qui est proprio aussi, vous aurez un code déjà plus portable.
    Vu qu'on est dans le sous-forum Oracle, il faudrait quand même préciser que les CTE récursives ne sont dispo dans Oracle que depuis 11gR2, ce qui peut limiter le côté portable dans une entreprise avec des bases Oracles qui ne sont pas forcément récentes.

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Vu qu'on est dans le sous-forum Oracle [...]
    Euh... Il a été déplacé, non ?
    Ou alors je me suis perdu

    Désolé

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Déplacé

  13. #13
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ah, je l'avais vu directement dans le sous-forum Oracle ... Je comprends mieux

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

Discussions similaires

  1. [SQL-SERVER 2000] Problème de requête sur une seule ligne
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/04/2006, 16h54
  2. [CSS][firefox]positionner mes div sur une seule ligne
    Par hansaplast dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 29/03/2006, 14h44
  3. Plusieures infos sur une seule ligne avec ou sans tableau
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/03/2006, 14h16
  4. Synedit -commentaires sur une seule ligne
    Par Malone dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/02/2006, 19h44
  5. wxWidgets : couleur de texte sur une seule ligne
    Par Oatly dans le forum wxWidgets
    Réponses: 8
    Dernier message: 05/12/2004, 19h24

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