Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/07/2011, 15h02   #1
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
Par défaut condition dans SELECT IN

bonjour,

J'ai essayé ceci:

Code :
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 :
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
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 15h15   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Comme cela ça fonctionnerait beaucoup mieux :
Code :
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 :
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 15h30   #3
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
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 :
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')
)
)
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 15h46   #4
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

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

Code :
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
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/07/2011, 16h47   #5
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
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 )
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 16h51   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/07/2011, 17h02   #7
Invité de passage
 
Inscription : mars 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 8
Points : 1
Points : 1
Citation:
Envoyé par al1_24 Voir le message
Arrivé à ce niveau de complexité, il sera plus facile d'utiliser une table de correspondance et faire une jointure dessus...
En effet.

Merci encore
zayid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 18h43   #8
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Pour déconner, je tenterais bien un petit :

Code :
1
2
3
4
 
INNER JOIN contact cnt
     ON       (art.LANGUAGE = 'fr' AND cnt.privilege IN ('public', 'private'))
           OR (art.LANGUAGE = 'en' AND cnt.privilege ='private'))
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h04.


 
 
 
 
Partenaires

Hébergement Web