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 where sur un couple de champs


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut condition where sur un couple de champs
    Bonjour,
    Si j'ai la table suivante

    champ1 Champ2 champ3
    tototot tatatat tititititi
    tututut tatatat tititititi
    tatatat tatatat tititititi
    tototot tututut tututut

    Je voudrais selectioner les lignes de cette table, sauf celles qui ont le couple champ1/champ3 egal à tototot/tututut
    Si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where (champ1<>'tototot' and champ2<>'tututut')
    j'enlève toutes les lignes qui ont 'tototot' sur champ1, hors je ne voudrais supprimer que les lignes qui ont 'tototot' sur champ1, mais que quand dans le meme temps champ3='tutututut'.
    Merci.
    Tata

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    As tu essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where (champ1,champ2)<>('tototot','tututut')

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    As tu essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where (champ1,champ2)<>('tototot','tututut')
    Merci de ta proposition.
    Je viens d'essayer, ca ne marche pas.
    J'ai aussi essayé de remplacer le <> par not in, c'est la meme erreur.

  4. #4
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    essaie ca

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE_1 WHERE (champ1<>'tototot' OR champ3<>'tututut');

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM TABLE
     WHERE (champ1<>'tototot' OR champ2<>'tututut')

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    Merci a tous les deux.
    Alors à priori la solution ce serait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM TABLE_1 WHERE (champ1<>'tototot' OR champ3='tututut');

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Non les réponses de fatsora et de shan08 sont correctes.
    Quand vous avez ce genre de problème, pensez à utiliser NOT.

    Dans votre cas, vous ne voulez pas champ1= 'tototot' qui soit en même temps que champ2= 'tututut'.

    En SQL, ça se traduit par : NOT ( champ1= 'tototot' AND champ2= 'tututut' )
    Cette syntaxe fonctionne.

    Vous pouvez ensuite convertir un par un tous les éléments.
    Not (égal) devient <>
    Not (AND) devient OR
    Et vous obtenez (champ1 <> 'tototot' OR champ2 <> 'tututut')

    En reprenant votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from
    (
    select 1 id, 'tototot' champ1, 'tatatat' champ2, 'tititititi' champ3 from dual union all
    select 2, 'tututut', 'tatatat', 'tititititi' from dual union all
    select 3, 'tatatat', 'tatatat', 'tititititi' from dual union all
    select 4, 'tototot', 'tututut', 'tututut' from dual
    )
    where not (champ1 = 'tototot' and champ2 = 'tututut')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID	CHAMP1	CHAMP2	CHAMP3
    1	tototot	tatatat	tititititi
    2	tututut	tatatat	tititititi
    3	tatatat	tatatat	tititititi
    Avec le OR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from
    (
    select 1 id, 'tototot' champ1, 'tatatat' champ2, 'tititititi' champ3 from dual union all
    select 2, 'tututut', 'tatatat', 'tititititi' from dual union all
    select 3, 'tatatat', 'tatatat', 'tititititi' from dual union all
    select 4, 'tototot', 'tututut', 'tututut' from dual
    )
    where champ1 <> 'tototot' or champ2 <> 'tututut'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID	CHAMP1	CHAMP2	CHAMP3
    1	tototot	tatatat	tititititi
    2	tututut	tatatat	tititititi
    3	tatatat	tatatat	tititititi
    Votre dernière requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from
    (
    select 1 id, 'tototot' champ1, 'tatatat' champ2, 'tititititi' champ3 from dual union all
    select 2, 'tututut', 'tatatat', 'tititititi' from dual union all
    select 3, 'tatatat', 'tatatat', 'tititititi' from dual union all
    select 4, 'tototot', 'tututut', 'tututut' from dual
    )
    where (champ1<>'tototot' OR champ3='tututut')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID	CHAMP1	CHAMP2	CHAMP3
    2	tututut	tatatat	tititititi
    3	tatatat	tatatat	tititititi
    4	tototot	tututut	tututut
    Ce qui est faux puisque la quatrième ligne apparaît.

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Il faut toujours garder à l'esprit qu'en SQL on peut comparer des n-uplets:
    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
     
    SQL> r
      1  SELECT * FROM
      2  (
      3  SELECT 1 id, 'tototot' champ1, 'tatatat' champ2, 'tititititi' champ3 FROM dual union ALL
      4  SELECT 2, 'tututut', 'tatatat', 'tititititi' FROM dual union ALL
      5  SELECT 3, 'tatatat', 'tatatat', 'tititititi' FROM dual union ALL
      6  SELECT 4, 'tototot', 'tututut', 'tututut' FROM dual
      7  )
      8* WHERE (champ1, champ2) != (('tototot','tututut'))
     
            ID CHAMP1  CHAMP2  CHAMP3
    ---------- ------- ------- ----------
             1 tototot tatatat tititititi
             2 tututut tatatat tititititi
             3 tatatat tatatat tititititi

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Il faut toujours garder à l'esprit qu'en SQL on peut comparer des n-uplets
    Merci pour la syntaxe, j'avais essayé avec (champ1, champ2) <> ('tototot','tututut') mais ça ne passe pas.
    Il faut donc doubler les parenthèses du tuple s'il s'agit de valeur fixe.

    Par contre, c'est spécifique Oracle il me semble : j'ai un SQL Server 2005 et un Sybase 12.5 sous la main, ça ne fonctionne ni sur l'un ni sur l'autre.

Discussions similaires

  1. Condition WHERE sur plusieurs enregistrements
    Par Jolindien31 dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2013, 14h34
  2. Requete avec condition where sur minute du timestamp
    Par mikael2235 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/03/2012, 22h54
  3. comment appliquer une condition where sur une datagridview
    Par moha1984 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 07/08/2008, 20h02
  4. condition where sur un type Oui/Non
    Par greg64 dans le forum Access
    Réponses: 3
    Dernier message: 20/04/2006, 12h42
  5. Réponses: 3
    Dernier message: 16/02/2006, 16h58

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