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

Développement SQL Server Discussion :

Enchainer des case [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut Enchainer des case
    Bonjour à tous,

    dans le case d'une migration des bases Access vers SQL SERVER, je suis amené à devoir réécrire les requêtes, je suis tombé sur l'une d'elles qui me cause des problèmes :

    Code ACCESS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT a.CodeAffaire, c1.NomEntreprise, c2.NomEntreprise, a.AdrFact, 
    IIf(l.NumRemorque Is Not Null And l.NumRemorque Not Like "","Remorque",IIf(l.NumCamion Is Not Null And l.NumCamion Not Like "",IIf(l.NumBras Is Not Null And l.NumBras Not Like "","Camion-Bras","Camion"),IIf(l.NumBenne Is Not Null And l.NumBenne Not Like "","Benne",IIf(l.NumBras Is Not Null And l.NumBras Not Like "","Bras",IIf(l.NumEngin Is Not Null And l.NumEngin Not Like "","Engin",""))))) AS TypeMat, 
    IIf(l.NumRemorque Is Not Null And l.NumRemorque Not Like "",l.NumRemorque,IIf(l.NumCamion Is Not Null And l.NumCamion Not Like "",IIf(l.NumBras Is Not Null And l.NumBras Not Like "",l.NumCamion & " - " & l.NumBras,l.NumCamion),IIf(l.NumBenne Is Not Null And l.NumBenne Not Like "",l.NumBenne,IIf(l.NumBras Is Not Null And l.NumBras Not Like "",l.NumBras,IIf(l.NumEngin Is Not Null And l.NumEngin Not Like "",l.NumEngin,""))))) AS NumMat
    FROM dbo_CLIENTS AS c1 
    RIGHT JOIN (dbo_CLIENTS AS c2 
    RIGHT JOIN (dbo_AFFAIRE AS a 
    INNER JOIN [dbo_LIGNE-AFFAIRE] AS l ON a.CodeAffaire=l.CodeAffaire) ON a.Contremarque=c2.N°Client) ON a.N°Client=c1.N°Client
    WHERE a.CodeAffaire like "R*" and a.CodeAffaire not like "RD*" and a.CodeAffaire not like "RE*" and a.CodeAffaire not like "RP*" and a.Facture=no
    ORDER BY a.CodeAffaire;

    Pour l'instant, j'ai fait cela
    Code SQL SERVER : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT a.CodeAffaire, c1.NomEntreprise, c2.NomEntreprise, a.AdrFact, 
    case when isnull(l.NumRemorque,'')='' then 'Remorque'
    	else case when isnull(l.NumCamion,'')='' then (case when isnull(l.NumBras,'')='' then 'Camion-Bras' else 'Camion' end)
    	else case when isnull(l.NumBenne,'')='' then 'Benne'
    	else case when isnull(l.NumBras,'')='' then 'Bras'
    	else case when isnull(l.NumEngin,'')='' then 'Engin' else  '' end as TypeMat
     
    FROM dbo.CLIENTS AS c1 
    RIGHT JOIN (dbo.CLIENTS AS c2 
    RIGHT JOIN (dbo.AFFAIRE AS a 
    INNER JOIN [dbo.LIGNE-AFFAIRE] AS l ON a.CodeAffaire=l.CodeAffaire) ON a.Contremarque=c2.numclient) ON a.numclient=c1.numclient
    WHERE a.CodeAffaire like 'R*' and a.CodeAffaire not like 'RD*' 
    and a.CodeAffaire not like 'RE*' and a.CodeAffaire not like 'RP*' and a.Facture='no'
    ORDER BY a.CodeAffaire

    Mais elle ne marche, j'ai comme message
    Syntaxe incorrecte vers le mot clé 'as'.
    Je ne vois pas d'où vient l'erreur, j'ai comme l'impression que cela vient de l'enchainement des CASE.

    Merci

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Effectivement, l'erreur vient de l'enchaînement des cases. A chaque case, il faut faire correspond un end. Et il en manque.

    Voici la requête corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT a.CodeAffaire, c1.NomEntreprise, c2.NomEntreprise, a.AdrFact, 
    case when isnull(l.NumRemorque,'')='' then 'Remorque'
    	else case when isnull(l.NumCamion,'')='' then (case when isnull(l.NumBras,'')='' then 'Camion-Bras' else 'Camion' end)
    	else case when isnull(l.NumBenne,'')='' then 'Benne'
    	else case when isnull(l.NumBras,'')='' then 'Bras'
    	else case when isnull(l.NumEngin,'')='' then 'Engin' else  '' end end end end end as TypeMat
     
    FROM dbo.CLIENTS AS c1 
    RIGHT JOIN (dbo.CLIENTS AS c2 
    RIGHT JOIN (dbo.AFFAIRE AS a 
    INNER JOIN [dbo.LIGNE-AFFAIRE] AS l ON a.CodeAffaire=l.CodeAffaire) ON a.Contremarque=c2.numclient) ON a.numclient=c1.numclient
    WHERE a.CodeAffaire like 'R*' and a.CodeAffaire not like 'RD*' 
    and a.CodeAffaire not like 'RE*' and a.CodeAffaire not like 'RP*' and a.Facture='no'
    ORDER BY a.CodeAffaire
    Ca fait bizarre, mais c'est ainsi !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    On peut peut-être profiter de la syntaxe de l'opérateur case pour simplifier la requête...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case when isnull(l.NumRemorque,'')='' then 'Remorque'
        when isnull(l.NumCamion,'')='' then (case when isnull(l.NumBras,'')='' then 'Camion-Bras' else 'Camion' end)
    	when isnull(l.NumBenne,'')='' then 'Benne'
    	when isnull(l.NumBras,'')='' then 'Bras'
    	when isnull(l.NumEngin,'')='' then 'Engin' 
        else  '' 
        end as TypeMat
    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.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses, en relisant ma requête, j'ai vu que j'ai mal interprété les conditions, il faut que chaque cas soit différent de la chaine vide et non égale, erreur de ma part

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    alors vous pouvez simplifier encore, en supprimant les ISNULL

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    alors vous pouvez simplifier encore, en supprimant les ISNULL
    Je voulais dire qu'au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when isnull(l.NumRemorque,'')='' then 'Remorque'
    Je dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when isnull(l.NumRemorque,'')<>'' then 'Remorque'

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Le ISNULL est en effet inutile puisque NULL <> "" n'est jamais vrai.
    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. [C#] Format des cases
    Par Damsou dans le forum ASP.NET
    Réponses: 6
    Dernier message: 03/02/2005, 09h46
  2. Vues avec des "case"
    Par jfphan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/01/2005, 12h17
  3. Réponses: 5
    Dernier message: 25/11/2004, 09h11
  4. Enchainer des fonctions dans un onclick d'un bouton
    Par jpg dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2004, 16h51
  5. [IHM] Enchainement des écrans
    Par CanardJM dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/06/2004, 16h01

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