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

MS SQL Server Discussion :

un IF dans un SELECT


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut un IF dans un SELECT
    Hello a vous, bidouilleur et autre expert SQL !

    Je souhaite construire une requete SQL qui fait un select de deux champs puis va fait un select avec un IF pour obtenir un troisieme champ.
    La requete seule avec le IF fonctionne si je l'isole mais des que je l'inclus dans le SELECT .... patrata (Syntaxe incorrecte vers le mot clé 'IF')

    Un exemple parle toujours mieux ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT INTERFACTURE.NUMFACT,IF LEFT((SELECT InterFacture.IDFacturation FROM InterFacture),1) ='P' SELECT PRO_Nom FROM Proprietaire WHERE IDProprietaire=(SELECT REPLACE((SELECT IDFacturation FROM InterFacture),'P','')) ELSE SELECT TIE_Nom FROM Tiers WHERE IDTiers=(SELECT REPLACE((SELECT IDFacturation FROM InterFacture),'I','')) FROM InterFacture INNER JOIN Intervention ON InterFacture.IF_NumInter=Intervention.NumInter WHERE INTERVENTION.I_DTESUP=''
    La requête retourne par ex:

    F0001 TIERS1
    F0002 PROPRIO1
    Le TIERS1 ou le PROPRIO1 dépendent de la valeur de IDFACTURATION, en quelque sorte, à quel nom est la facture.
    Si je prend juste le IF dans une requête il me retourne bien TIERS1 ou PROPRIO1 suivant a quel nom a été la facture.

    Merci d'avance pour vos réponses,

    J'ai parcouru divers forum mais je n'arrive pas a voir ce qui louche ...

    Cordialement,

  2. #2
    Membre expérimenté
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Par défaut
    Le CASE devrait répondre à vos besoins. Bonne lecture.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    Merci beaucoup, effetivement cela fonctionne.

    Je suis passé hier a cote de ce CASE mais sans penser l'utiliser.

    Merci,

    Cordialement,




    Citation Envoyé par KookieMonster Voir le message
    Le CASE devrait répondre à vos besoins. Bonne lecture.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    J'avais passé ce sujet en RESOLU car effectivement la modification de IF .. en CASE a repondu a mes attentes ... MMAIISSSSS ! seulement dans le cas ou la table InterFacture ne contient qu'un seul enregistrement.

    Au dela, je suppose que comme il n'y a pas de clause WHERE dans la sous-requete, plusieurs champs sont remontés d'ou le message:

    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.

    Donc au final ma requete ne fonctionne que si un seul enregistrement, au dela message ci-dessus

    SELECT INTERFACTURE.NUMFACT,CASE WHEN LEFT((SELECT IDFacturation FROM InterFacture),1) = 'P' THEN (SELECT PRO_Nom FROM Proprietaire WHERE IDProprietaire=(SELECT REPLACE((SELECT IDFacturation FROM InterFacture),'P',''))) WHEN LEFT((SELECT IDFacturation FROM InterFacture),1) <> 'P' THEN (SELECT TIE_Nom FROM Tiers WHERE IDTiers=(SELECT REPLACE((SELECT IDFacturation FROM InterFacture),'I',''))) END FROM InterFacture

    Puis je à l'interieur de mon CASE ... lui mettre des WHERE dans chaque "SELECT IDFacturation FROM InterFacture" en disant par exemple que je souhaite prendre pour chaque ligne juste le IDFACTURATION de la ligne concernée ..... dans le premier SELECT.
    J'ai bien tenté de faire des WHERE numfact=numfact ou de mettre des AS par ci par la pour faire une correspondance de valeur entre le premier SELECT et les SELECT dans le CASE mais ..... mes cours de SQL sont bien loin !

    Je sais pas si j'arrive a me faire comprendre ! si non je peux fournir un exemple plus simple

    Encore merci pour votre aide .. 2 jours que je reflechis et m'en sor
    t pas.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    SVP indentez votre requête et mettez là dans un tag code. Car c'est illisible !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Par défaut
    Merci SQLPro pour votre aide.
    En mettant au propre ma requete, je me suis rendu compte que pour tester la sous-requete seule, j'avais inclus des Select .... From qui en fait faisait doublon, alors que le IDFActuration pouvait etre utilisé tel quel.

    Bref, un grand MERCI.

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Citation Envoyé par SQLpro
    SVP indentez votre requête et mettez là dans un tag code. Car c'est illisible !
    Bon ben là c'est moi qui m'y suis collé ... mais c'est toujours pas lisible

    C'est un truc comme ça que tu voulais (une fois viré tout le superflux) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT		FI.NUMFACT
    		, CASE LEFT(FI.IDFacturation, 1)
    			WHEN 'P' THEN P.PRO_Nom
    			ELSE T.TIE_Nom
    		END AS fature_nom
    FROM		dbo.InterFacture AS FI
    INNER JOIN	dbo.Intervention AS IV
    			ON FI.IF_NumInter = IV.NumInter
    LEFT JOIN	dbo.Proprietaire AS P
    			ON P.IDProprietaire = REPLACE(FI.IDFacturation, 'P', '')
    LEFT JOIN	dbo.Tiers AS T
    			ON T.IDTiers = REPLACE(FI.IDFacturation, 'I', '')
    WHERE		IV.I_DTESUP = ''
    En tout cas c'est sûr, c'est parfaitement modélisé

    @++

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

Discussions similaires

  1. formater un champ date dans un select
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/04/2006, 16h44
  2. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 06h45
  3. Joindre une valeur arbitraire dans un SELECT
    Par Tuxxy dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/01/2004, 17h04
  4. Réponses: 3
    Dernier message: 23/09/2003, 09h12
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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