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 dans SELECT IN


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Par défaut condition dans SELECT IN
    bonjour,

    J'ai essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select article from table_article where type in (select type from article where profil='public')
    la requête qui se trouve dans le "IN" renvoie plus d'une valeur mais pas de prob, ça fonctionne.

    Maintenant, j'aimerais ajouter une conditon avec decode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select article from table_article where type in 
    (
    decode
    (
    (select privilege from contact where id=$id),
    'public',(select type from article where profil='public'),
    'private',(select type from article where profil='private')
    )
    )
    La fonction decode ne peur renvoyer qu'une seule valeur mais dans mon cas, la valeur que je veux faire renvoyer est un sql pour le IN, pas le résultat de l'évaluation de la requête...

    Comment puis-je faire?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Comme cela ça fonctionnerait beaucoup mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  tbl.article 
    FROM    table_article tbl
    WHERE   tbl.type IN 
            (   SELECT  art.type 
                FROM    article art
                    INNER JOIN
                        contact cnt
                        ON  art.profil = cnt.privilege
                WHERE   cnt.id = $id
            )
    ;
    Ou comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  tbl.article 
    FROM    table_article tbl
    WHERE   EXISTS 
            (   SELECT  1 
                FROM    article art
                    INNER JOIN
                        contact cnt
                        ON  art.profil = cnt.privilege
                WHERE   cnt.id = $id
                    AND tbl.type = art.type
            )
    ;
    Attention, TYPE est un mot réservé du langage SQL et il est déconseillé de l'utiliser pour un nom d'objet (ici, un nom de colonne).
    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 régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Par défaut
    ok, en fait mon example n'est pas bon

    Ta solution fonctionne bien dans ce cas car y a une relation entre la table contact et article mais je voulais un truc plus générique qui fonctionnerait avec une condition quelconque...

    Imaginons (c'est un exemple bidon )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT article FROM table_article WHERE type IN 
    (
     
    decode
    (
    (SELECT privilege FROM contact WHERE id=$id),
    'public',(SELECT type FROM article WHERE language='fr'),
    'private',(SELECT type FROM article WHERE language='en')
    )
    )

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Ben dans ce cas tu peux mettre un CASE dans la jointure d'al1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INNER JOIN
                        contact cnt
                        ON  CASE art.language WHEN 'fr' THEN 'public' WHEN 'en' THEN 'private' END = cnt.privilege
    ... et il y a bien une relation puisque tu utilises decode pour lier les deux

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Par défaut
    Ok, reste un problème (mon exemple foireux ne le montrait pas): dans le cas où langage est 'fr' par exemple, je voudrais qu'il me retourne les 'public' ET 'private' (imaginons qu'il y ait encore d'autres catégories que public et private comme invité, test, etc.).

    Là encore, le case of ne me le permet pas...

    Il faudrait un 2ème join avec les mêmes tables et un alias différent?


    En tout cas, merci de vos réponses (et surtout de me comprendre )

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Arrivé à ce niveau de complexité, il sera plus facile d'utiliser une table de correspondance et faire une jointure dessus...
    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.

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

Discussions similaires

  1. [AC-2010] Concaténation sous conditions dans select
    Par akkyshan dans le forum Access
    Réponses: 1
    Dernier message: 28/03/2014, 10h42
  2. condition dans requête select
    Par lionel256 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/05/2008, 10h23
  3. [MySQL] Problème de condition dans le SELECT
    Par nicocaine dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/06/2007, 08h20
  4. Problème de condition dans SELECT
    Par nicocaine dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/06/2007, 14h06
  5. 3 conditions dans une clause SELECT
    Par Aurèl90 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/11/2005, 16h05

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