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 :

SQL Server Msg 4145, niveau 15, état 1, une expression de type non booléen


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut SQL Server Msg 4145, niveau 15, état 1, une expression de type non booléen
    Bonjour,
    je reçois le message d'erreur ci-dessous au niveau du Case, lorsque j' exécuter le code ci-dessous:

    An expression of non-boolean type specified in a context where a condition is expected
    Aidez-moi
    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT dt FROM tPerr WHERE dt  BETWEEN  @p1 And @p2 GROUP BY dt
    HAVING 
    CASE -- c est ici l'erreur
         WHEN ISNUMERIC (sdk) =1 THEN
          SUM(CAST (sdk AS Float)) > 7 
    End
    la Table tPerr est contient les colonnes dt et sdk

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 469
    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 469
    Par défaut
    Bonjour,
    Il n'y a pas de ELSE dans ton CASE, donc si la condition n'est pas validée, l'expression envoie NULL qui (il me semble) n'est pas un booléen.
    Pour ma part je mettrai le test IsNumeric dans la clause WHERE, et non dans le HAVING.

    Tatayo.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour la réponse. Même avec un Else et le test IsNumeric dans la clause WHERE, j'ai la même erreur.

  4. #4
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 60
    Par défaut
    Bonjour !
    je pense qu'il faut sortir "> 7" du CASE, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CASE -- c est ici l'erreur
         WHEN ISNUMERIC (sdk) =1 THEN SUM(CAST (sdk AS Float)) 
         ELSE 9999
    End > 7

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 968
    Par défaut
    Avec une bribe de requête difficile à dire d'où vient l'erreur.

    Petit test pour valider que tout fonctionne comme prévu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @test as varchar(max)
    set @test = '1' 
    select @test
    	, ISNUMERIC(@test) 
    	, case ISNUMERIC(@test) when 1 then 2 else 99 end as testcase
    --where case ISNUMERIC(@test) when 1 then 2 else 99 end >7

  6. #6
    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
    Par défaut
    bonjour,

    vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HAVING SUM(TRY_CAST(sdk AS Float)) > 7

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Bonjour Michel.Priori,

    le probleme se trouve au niveau de Having By et comme je dois calculer la somme impossible de nepasser par having By et Cast(---) pour la conversion.
    Dans ton exemple, il n'y a pas de having by.
    Par contre avec la solution de sebastien_m merci en passant j'ai pu resoudre le problème de Cast(...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dt FROM tPerr WHERE dt  BETWEEN  @p1 And @p2 GROUP BY dt
    HAVING 
    CASE 
         WHEN ISNUMERIC (sdk) =1 THEN
          SUM(CAST (sdk AS Float)) 
    else NULL
    End > 7

    mais voilà ça me renvoie cette fois ci une autre erreur suivante:

    Msg 8121, Level 16
    Column 'tPerr.sdk' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
    j'ai changé mon code comme ceci en ajoutant dans Group By ' sdk'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dt FROM tPerr WHERE dt  BETWEEN  @p1 And @p2 GROUP BY dt, sdk
    HAVING 
    CASE
         WHEN ISNUMERIC (sdk) =1 THEN
          SUM(CAST (sdk AS Float)) 
    else NULL
    End > 7


    Msg 8114, Level 16
    Error converting data type varchar to numeric

    du coup je fais ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dt FROM tPerr WHERE dt  BETWEEN  @p1 And @p2 GROUP BY dt, CAST (sdk AS Float)
    HAVING 
    CASE 
         WHEN ISNUMERIC (sdk) =1 THEN
          SUM(CAST (sdk AS Float)) 
    else NULL
    End > 7
    et ça me renvoie encore ce message d'erreur.

    Msg 8121, Level 16
    Column 'tPerr.sdk' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.


    aidez moi s'il vous plait.

    Merci

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Est-ce que comme cela ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dt FROM tPerr WHERE dt  BETWEEN  @p1 And @p2 GROUP BY dt
    HAVING 
    SUM(CASE 
         WHEN ISNUMERIC (sdk) =1 THEN
          CAST (sdk AS Float)
    else NULL
    End ) > 7
    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. Erreur SQL : Serveur*: Msg 16958, Niveau 16, État 1, Ligne 503
    Par Imad_ing dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 14/04/2008, 16h05
  2. Réponses: 1
    Dernier message: 24/10/2007, 08h24
  3. Réponses: 3
    Dernier message: 12/10/2007, 16h26
  4. Réponses: 2
    Dernier message: 23/11/2006, 10h37
  5. [SQL-SERVER] Connaitre le numero de version d'une BD
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/03/2006, 15h03

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