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 :

Problème de syntaxe d'un CASE dans un WHERE?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 50
    Points
    50
    Par défaut Problème de syntaxe d'un CASE dans un WHERE?
    Bonjour,

    Je suis sous SQL Server 2005, j'ai créé ma procédure stockée qui doit me renvoyer certaines lignes qui sont triées grace à ma clause WHERE. Un des tri se fera via un paramètre (@Officiel int) passé à la procédure stockée.

    Voici les différents tests effectués qui donnent une erreure (j'ai essayé en mettant des quotes, double quotes, virgules, etc.).

    An expression of non-boolean type specified in a context where a condition is expected, near 'AND'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE 
    	CASE @Official 
    		WHEN 0 THEN 'Game.id_member > 1'
    		WHEN 1 THEN 'Game.id_member = 1'
    		WHEN 2 THEN 'Game.id_member => 1'
    	END AND Game.id_event = @EventID
    Incorrect syntax near '>'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE 
    	CASE @Official 
    		WHEN 0 THEN Game.id_member > 1
    		WHEN 1 THEN Game.id_member = 1
    		WHEN 2 THEN Game.id_member => 1
    	END AND Game.id_event = @EventID
    Auriez-vous une idée?
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    ralalà je te l'ai dit dans ton autre message. On ne mets pas entre quote un nom de colonne.

    D'autre part si on lit ta condition elle n'a pas de sens: Si @Official =0 alors l'id_member >1 ???!!
    alors qu'on attends une expression résultat et non une condition à la sortie du THEN. (à moins de faire un sous case when). On attends quelque chose comme "Si @Official =0 et l'id_member >1 alors une colonne ou une variable ou une constante".

    Il faut que tu nous dises ce que tu veux en français parceque là c'est impossible de comprendre. Le case when n'est peut-être même pas utile.

    Fonction CASE simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE Code_Pays
        WHEN 'US' then 0.7446*prix
        WHEN 'GB' then 1.4683*prix
        ELSE prix
    END PRIX_EUROS
    Fonction CASE recherchée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE 
        WHEN Code_Pays='US' then 0.7446*prix
        WHEN Code_Pays='GB' then 1.4683*prix
        ELSE prix
    END PRIX_EUROS
    C'est ce dernier case qui permet d'utiliser les opérateur qui ne sont pas '='.

  3. #3
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 50
    Points
    50
    Par défaut
    En fait chaque enregistrement dans ma table à une colonne id_member.
    Si id_membre = 1 alors c'est "officiel" si c'est id_membre > 1 alors c'est non officiel.

    Le paramètre @Official de ma procédure stockée dit ce que l'on souhaite obtenir :
    - @Officiel = 0 : afficher seulements les non officiels (WHERE id_membre > 1)
    - @Officiel = 1 : afficher seulement les officiels (WHERE id_membre = 1)
    - @Officiel = 2 : afficher tout (WHERE id_membre => 1)

    Comment mettre ca sous la forme d'un CASE dans ma clause WHERE ?

    Merci à vous et à toi phil

  4. #4
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    je comprends mieux Donc une solution serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WHERE 
    (
       (@Official=0  AND Game.id_member > 1)
    OR
       (@Official=1  AND Game.id_member = 1)
    OR
       (@Official=2  AND Game.id_member >= 1)
    ) AND Game.id_event = @EventID
    Où chaque comparaison de Game.id_member n'est exécuté qu'en fonction de la valeur de @Offficial. Autrement ça jour le rôle de Si ALORS SI ALORS

    Attention les OR sont consommateurs de process machine.

    Sinon avec le case ça pourrait donner cela mais c'est inapproprié je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WHERE 
    	(CASE 
               WHEN @Official =0 AND Game.id_member > 1 THEN 1
               WHEN @Official =1 AND Game.id_member = 1 THEN 1
               WHEN @Official =2 AND Game.id_member => 1 THEN 1
            ELSE 0
    	END)=1 
          AND Game.id_event = @EventID
    le 1 du THEN jouant le rôle d'un booléen. Sous SQL server tu peux remplacer par true/false (THEN true...ELSE false END)=true

  5. #5
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 50
    Points
    50
    Par défaut
    Ca fonctionne Merci à toi phil_b. Je vais essayer de faire beaucoup plus attention avant de demander sur le forum mais merci à toi en tout cas!

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

Discussions similaires

  1. [XL-2002] Problème de syntaxe sur une formule dans VBA
    Par beber_le_stagiaire dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/06/2009, 15h32
  2. problème de syntaxe pour select case
    Par bddaccess dans le forum VBA Access
    Réponses: 23
    Dernier message: 23/09/2008, 11h24
  3. [MySQL] Problème de syntaxe avec variable utilisée dans fonction PHP et MySQL
    Par redvivi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/03/2008, 21h07
  4. un CASE dans un WHERE...
    Par nox75 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/09/2007, 14h47
  5. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07

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