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

Langage SQL Discussion :

condition if


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut condition if
    Bonjour

    j'ai un probleme avec une requete

    contexte
    j'ai 'une table anomalie qui contient entre autre un champ id_vm_prev
    (ce champ peut ne rien contenir donc etre null)
    et un champ id_anomalie

    et j'ai une autre table vm qui contient 3 champs :
    id_vm ,nom ,id_vmaj
    j'utilise oracle



    je fais une requete select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    select v.nom.... from vm v,anomalie a  where v.nom=(select v1.nom from vm v1 where  v1.id_vm =  a. id_vm_prev)  ...
    le probleme est que a.id_vm_prev peut etre null et dans ce cas là je voudrais que mon v.nom soit fixée à null ou à ''

    cette requete focntionne quand mon champ a. id_vm_prev n'est pas null puisqu'il y a une correspondance dans ma table vm !

    je ne sais pas si c'est clair mais si c'est le cas est ce que ce que je veux est realisable et si oui est ce que vous auriez une idée svp

    merci d'avance

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT a.IdAnomalie, v.nom.... 
    FROM anomalie a LEFT OUTER JOIN vm v ON  v.id_vm =  a.id_vm_prev
    PS comme tu n'as pas cité ton moteur et sa version, j'ai utilisé la syntaxe normée, en espérant que ton moteur la comprend...

  3. #3
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    dejà merci de t'etre penché sur mon probleme

    je vais mettre la requete en entier ...je pense que ce sera mieux car je ne comprends pas la syntaxe que tu m'as donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct(A.ID_ANOMALIE),A.REF_EXTERNE,A.TITRE,G.NOM,O.NOM,
    A.DATE_DETECTION,VM.NOM,null,'',A.RETARD FROM GRAVITE G,ORIGINE O,ANOMALIE A,ETAT E,HISTORIQUE H,SEMAINE S,VERSION_MINEURE VM WHERE  A.ID_ANOMALIE=H.ID_ANOMALIE AND H.ID_ETAT=E.ID_ETAT AND E.NOM in ('PC:Prise en compte','AF:Affectée fournisseur') AND G.ID_GRAVITE= A.ID_GRAVITE AND O.ID_ORIGINE=A.ID_ORIGINE AND H.DATE_HISTORIQUE=(SELECT Max(H1.DATE_HISTORIQUE) FROM HISTORIQUE H1 WHERE TO_CHAR(H1.DATE_HISTORIQUE,'YYYYWW') <= TO_CHAR(S.S,'YYYYWW') AND   H1.ID_ANOMALIE=A.ID_ANOMALIE ) AND A.ID_DOMAINE in ({1}) AND A.ID_ORIGINE IN ({2}) AND TO_CHAR(S.S,'YYYYWW')=?[color=darkred] AND 
    VM.NOM=(SELECT VM1.NOM FROM VERSION_MINEURE VM1 WHERE VM1.ID_VERSION_MINEURE=A.ID_VERSION_MIN_PREVISIONNELLE 
    )[/color]
    c'est la partie en rouge qui me pose probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    SELECT distinct(A.ID_ANOMALIE),A.REF_EXTERNE,A.TITRE,G.NOM,O.NOM,
    A.DATE_DETECTION,VM.NOM,null,'',A.RETARD FROM GRAVITE G,ORIGINE O,ANOMALIE A,ETAT E,HISTORIQUE H,SEMAINE S,VERSION_MINEURE VM 
    [color=darkred]LEFT OUTER JOIN VERSION_MINEURE VM ON  VM.id_VM =  A.ID_VERSION_MINEURE_PREVISIONNELLE[/color]
    WHERE  A.ID_ANOMALIE=H.ID_ANOMALIE AND H.ID_ETAT=E.ID_ETAT AND E.NOM in ('PC:Prise en compte','AF:Affectée fournisseur') AND G.ID_GRAVITE= A.ID_GRAVITE AND O.ID_ORIGINE=A.ID_ORIGINE AND H.DATE_HISTORIQUE=(SELECT Max(H1.DATE_HISTORIQUE) FROM HISTORIQUE H1 WHERE TO_CHAR(H1.DATE_HISTORIQUE,'YYYYWW') <= TO_CHAR(S.S,'YYYYWW') AND   H1.ID_ANOMALIE=A.ID_ANOMALIE ) AND A.ID_DOMAINE in ({1}) AND A.ID_ORIGINE IN ({2}) AND TO_CHAR(S.S,'YYYYWW')=?
    il faudrait que je teste la requete ci-dessus c'est ça ?

    ps: version oracle : 9i

  4. #4
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    j'ai testé cette requete avec toad

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT distinct(A.ID_ANOMALIE),A.REF_EXTERNE,A.TITRE,G.NOM,O.NOM,
    A.DATE_DETECTION,VM.NOM,null,'',A.RETARD FROM GRAVITE G,ORIGINE O,ANOMALIE A,ETAT E,HISTORIQUE H,SEMAINE S,VERSION_MINEURE VM 
    LEFT OUTER JOIN VERSION_MINEURE VM ON VM.ID_VERSION_MINEURE=A.ID_VERSION_MINEURE_PREVISIONNELLE WHERE A.ID_ANOMALIE=H.ID_ANOMALIE AND H.ID_ETAT=E.ID_ETAT AND E.NOM in ('PC:Prise en compte','AF:Affectée fournisseur') AND G.ID_GRAVITE= A.ID_GRAVITE AND O.ID_ORIGINE=A.ID_ORIGINE AND H.DATE_HISTORIQUE=(SELECT Max(H1.DATE_HISTORIQUE) FROM HISTORIQUE H1 WHERE TO_CHAR(H1.DATE_HISTORIQUE,'YYYYWW') <= TO_CHAR(S.S,'YYYYWW') AND   H1.ID_ANOMALIE=A.ID_ANOMALIE ) AND A.ID_DOMAINE in (2) AND A.ID_ORIGINE IN (2) AND TO_CHAR(S.S,'YYYYWW')=200549
    et j'ai le message d'erreur

    ORA-00972 :l'identificateur est trop long : A.ID_VERSION_MINEURE_PREVISIONNELLE

  5. #5
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    on va dire que je l'ai un peu corrigée mais j'ai toujours un probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT distinct(A.ID_ANOMALIE),A.REF_EXTERNE,A.TITRE,G.NOM,O.NOM,
    A.DATE_DETECTION,VM.NOM,null,'',A.RETARD FROM GRAVITE G,ORIGINE O,ANOMALIE A,ETAT E,
    HISTORIQUE H,SEMAINE S,VERSION_MINEURE VM LEFT OUTER JOIN ANOMALIE A1 ON VM.ID_VERSION_MINEURE = A1.ID_VERSION_MIN_PREVISIONNELLE WHERE A.ID_ANOMALIE=H.ID_ANOMALIE AND H.ID_ETAT=E.ID_ETAT AND E.NOM in ('PC:Prise en compte','AF:Affectée fournisseur') AND G.ID_GRAVITE= A.ID_GRAVITE AND O.ID_ORIGINE=A.ID_ORIGINE AND H.DATE_HISTORIQUE=(SELECT Max(H1.DATE_HISTORIQUE) FROM HISTORIQUE H1 WHERE TO_CHAR(H1.DATE_HISTORIQUE,'YYYYWW') <= TO_CHAR(S.S,'YYYYWW') AND H1.ID_ANOMALIE=A.ID_ANOMALIE) AND A.ID_DOMAINE in (2) AND A.ID_ORIGINE IN (2) AND TO_CHAR(S.S,'YYYYWW')=200541
    j'ai la "creation" d'une table qui contient pour le même id_anomalie tous le s noms de la table VERSION_MINEURE dans le champ VM.NOM

    en fait il se peut que j'ai une ligne du type dans ma table anomalie

    id_ano ... id_version_min_previsionnelle... champbidon

    78 pas de valeur X

    et que dans ma table VERSION_MINEURE

    ID_VERSION_MINEURE NOM
    74 toto

    ce que je veux c'est que lorsque
    je n'ai pas le champ id_version_min_previsionnelle renseigné dans ma table anomalie la requete me renvoit le champ vide mais que lorsque ce champ est renseigné je veux recupere le nom correspond à ce numero dans la table VERSION _MINEURE


    si j'ai

    id_ano ... id_version_min_previsionnelle... champbidon

    78 ---------- 254 -------------------------------- X

    et que dans ma table VERSION_MINEURE

    ID_VERSION_MINEURE NOM
    254 ----------------lulu---

    j'aimerais que mon selec me renvoit lulu

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Merci d'indenter tes requêtes, c'est illisile !

    Voilà le copier/coller de ta requête, après un passage par OnLine SQL Formatter et qq espaces/sauts de lignes supprimés, tu avoueras que ça n'est pas la même chose

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SELECT DISTINCT (A.ID_ANOMALIE),
                    A.REF_EXTERNE,
                    A.TITRE,
                    G.NOM,
                    O.NOM,
                    A.DATE_DETECTION,
                    VM.NOM,
                    NULL,
                    '',
                    A.RETARD
    FROM   GRAVITE G,
           ORIGINE O,
           ANOMALIE A,
           ETAT E,
           HISTORIQUE H,
           SEMAINE S,
           VERSION_MINEURE VM LEFT OUTER JOIN ANOMALIE A1
              ON VM.ID_VERSION_MINEURE = A1.ID_VERSION_MIN_PREVISIONNELLE
     WHERE A.ID_ANOMALIE = H.ID_ANOMALIE
       AND H.ID_ETAT = E.ID_ETAT
       AND E.NOM IN ('PC:Prise en compte', 'AF:Affectée fournisseur')
       AND G.ID_GRAVITE = A.ID_GRAVITE
       AND O.ID_ORIGINE = A.ID_ORIGINE
       AND H.DATE_HISTORIQUE = (SELECT MAX(H1.DATE_HISTORIQUE)
                                  FROM HISTORIQUE H1
                                 WHERE TO_CHAR(H1.DATE_HISTORIQUE, 'YYYYWW') <= TO_CHAR(S.S, 'YYYYWW')
                                   AND H1.ID_ANOMALIE = A.ID_ANOMALIE)
       AND A.ID_DOMAINE IN (2)
       AND A.ID_ORIGINE IN (2)
       AND TO_CHAR(S.S, 'YYYYWW') = 200541
    2 remarques vite fait :
    - '' ou NULL, c'est pareil sous Oracle,
    - la clause IN (2) est à remplacer par = 2
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    finallement un collegue m'a aidé ...


    solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    A.ID_VERSION_MIN_PREVISIONNELLE = VM.ID_VERSION_MINEURE(+)
    jointure tenant compte du fait que le resultat est null dans la second table

    j'avoue que je ne connaissais pas du tout

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

Discussions similaires

  1. Condition If multiple
    Par M1000 dans le forum ASP
    Réponses: 2
    Dernier message: 01/03/2004, 13h46
  2. [MYSQL] conditions et requetes
    Par sebos63 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/02/2004, 16h41
  3. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04
  4. Condition et contenu TImage
    Par Detlev_linux dans le forum Langage
    Réponses: 6
    Dernier message: 23/12/2003, 01h00
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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