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 :

Vérifier une clause à 3 cas de figure dont 2 In


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2024
    Messages : 45
    Par défaut Vérifier une clause à 3 cas de figure dont 2 In
    Bonjour,

    J'ai encore un souci avec une requête qui va servir à la génération d'un rapport (MS Report builder).

    Les parties SELECT et FROM sont OK, j'ai les bons noms de tables et les colonnes correspondant aux informations que je dois récupérer.

    Le point qui m'ennuie est une des clauses dans le WHERE.
    J'ai un des paramètres en entrée, que j'ai appelé @TypeTravail, qui pourra prendre une (seule et unique) valeur parmi ces 3 : Routage, Autres, Tous.
    Dans le cas où @TypeTravail est Routage, je dois vérifier la condition B1.ResourceType IN ('RO', 'RP', 'RU');
    Si @TypeTravail est Autres, cette fois je dois vérifier B1.ResourceType NOT IN ('RO', 'RP', 'RU');
    Et si @TypeTravail est Tous, je n'ai pas besoin de filtrer B1.ResourceType, donc je pensais juste vérifier une clause B1.ResourceType <> '' pour contrôler que la colonne ne soit pas vide (l'ERP ne permet pas d'avoir une valeur vide pour cette colonne).

    Mon code actuel est rédigé de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AND (CASE WHEN @TypeTravail = 'Routage' THEN B1. ResourceType IN ('RO', 'RP', 'RU')
    		 ELSE WHEN  @TypeTravail = 'Autres' THEN B1. ResourceType NOT IN ('RO', 'RP', 'RU')
    		 ELSE B1.ResourceType <> '' END)
    Mais SQL Server Management Studio me reproche une syntaxe incorrecte : Incorrect syntax near the keyword 'IN'

    J'ai fait un 2eme essai pour retirer la partie "IN" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AND (CASE WHEN @TypeTravail = 'Routage' THEN (B1. ResourceType = 'RO'OR B1.ResourceType = 'RP' OR B1.ResourceType =  'RU')
    		 ELSE WHEN  @TypeTravail = 'Autres' THEN (B1.ResourceType <> 'RO' AND B1.ResourceType <> 'RP'AND B1.ResourceType <>  'RU')
    		 ELSE B1.ResourceType <> '' END)
    Réponse de SSMS : Incorrect syntax near '='

    Dans les deux cas, la ligne concernée est celle où mon CASE commence.

    Quelle méthode pourrais-je utiliser pour pouvoir vérifier ces conditions?
    Merci d'avance pour vos lumières

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 348
    Par défaut
    Bonjour,
    Tu peux remplacer le CASE par une simple "combinaison):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    AND ((@TypeTravail = 'Routage' AND B1. ResourceType IN ('RO', 'RP', 'RU'))
    OR (@TypeTravail = 'Autres' AND B1. ResourceType NOT IN ('RO', 'RP', 'RU'))
    OR (@TypeTravail not in ('Routage','Autres') and B1.ResourceType <> ''))

    Tatayo.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2024
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2024
    Messages : 45
    Par défaut
    Bonjour Tatayo,

    Merci, cette fois la requête passe

    Je passe la question en résolu, je n'ai plus qu'à vérifier que les résultats sont bien ceux qu'il me faut.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 980
    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 980
    Billets dans le blog
    6
    Par défaut
    En fait le CASE est plus efficace si c'est un CASE valué et non un CASE généralisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ...
    FROM   ...
    WHERE  CASE @TypeTravail 
              WHEN 'Tous' THEN 1
              WHEN 'Routage' AND B1.ResourceType IN ('RO', 'RP', 'RU') THEN 1
              WHEN 'Autres' AND B1.ResourceType NOT IN ('RO', 'RP', 'RU') THEN 1
              ELSE 0
           END = 1
    À lire : https://sqlpro.developpez.com/cours/sqlaz/select/#L7


    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/ * * * * *

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 932
    Par défaut
    Citation Envoyé par Sylv_62 Voir le message
    Mon code actuel est rédigé de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AND (CASE WHEN @TypeTravail = 'Routage' THEN B1. ResourceType IN ('RO', 'RP', 'RU')
    		 ELSE WHEN  @TypeTravail = 'Autres' THEN B1. ResourceType NOT IN ('RO', 'RP', 'RU')
    		 ELSE B1.ResourceType <> '' END)
    L'expression CASE n'admet seulement une expression (valeur calculée ou pas) après THEN
    https://learn.microsoft.com/fr-fr/sq...ult_expression

    Ici l'opérateur IN ou NOT IN est une conditionnelle, pas une expression ; d'où le message d'erreur

    La réponse de SQLpro, qui tient compte du fait que seules 3 valeurs sont admises (Routage, Autres, Tous), est élégante
    Le savoir est une nourriture qui exige des efforts.

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

Discussions similaires

  1. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 18h05
  2. Réponses: 7
    Dernier message: 15/03/2005, 15h44
  3. [forms] Bloc basé sur une clause from
    Par plaineR dans le forum Forms
    Réponses: 11
    Dernier message: 16/12/2004, 13h02
  4. Réponses: 3
    Dernier message: 11/03/2004, 11h58
  5. Probleme dans une clause like !
    Par adil dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/07/2003, 17h47

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