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 :

Problème de syntaxe pour une requête SQL


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut Problème de syntaxe pour une requête SQL
    Bonsoir,

    Voilà plusieurs heures que je planche sur une requête bateau mais impossible de la faire fonctionner...

    je veux sélectionner les lignes uniquement quand :
    • EventStamp est entre '2017-05-26 00:00:01' et '2017-06-26 00:00:01'
    • TagName ne contient pas 'Flag'
    • TagName ne contient pas '_TMP_'
    • TagName ne contient pas 'AL' uniquement si value est différent de True


    Tout fonctionne sauf lorsque j’essaye de rajouter la dernière condition avec 'AL' et true... Une idée ?
    je vous ai mis mon début de requête dessous pour voir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select top 1000 *
    FROM [Runtime].[dbo].[v_EventHistory] 
    where (EventStamp BETWEEN  '2017-05-26 00:00:01'  AND  '2017-06-26 00:00:01' )  
    		AND NOT (TagName Like '%Flag%')
    		AND NOT (TagName Like '%_TMP_%')
    		AND NOT (TagName Like '%AL' AND value = 'true')

  2. #2
    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 789
    Points
    30 789
    Par défaut
    Citation Envoyé par hunteshiva Voir le message
    Tout fonctionne sauf lorsque j’essaye de rajouter la dernière condition avec 'AL' et true... Une idée ?
    "ça ne fonctionne pas" n'est pas un message d'erreur.

    Que se passe-t-il lorsque tu ajoutes cette dernière condition ?
    Un message d'erreur ? Lequel ?
    Un comportement inattendu ? Donne-nous un exemple.

    Ce qui pourrait aider aussi à a résolution de ton problème, c'est de connaître la structure de ta table et en particulier le type de la colonne value.
    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.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    En plus ce qui a été demandé, à juste titre, par al1_24, ci-dessous deux questions subsidiaires :

    1 - Le dernier critère c'est "Ne contient pas 'AL'" ou bien "Ne finit pas par 'AL'". Parce que tel que c'est traduit dans la requête SQL, cela signifie plutôt "Ne finit par par 'AL'" (?) il y a donc contradiction avec l'énoncé initial.

    2 - Est-ce que,, dans l'expression SQL (TagName Like '%_TMP_%') (c.à.d TagName ne contient pas '_TMP_'), le caractère souligné '_' fait partie du texte (ou littéral) recherché ou bien il est utilisé en tant caractère générique ?
    Attention : Les caractères '_', '%' et '[', ']', '^' ,.. sont des caractères "génériques" et ils sont interprétés de manière bien particulière par le moteur SQL.

    Si le caractère souligné '_' fait réellement partie du texte (ou littéral) recherché, alors il vous faudra fournir un caractère d'échappement et faire précéder chaque caractère souligné '_' par le dit caractère d'échappement. Sinon le résultat peut être faux !

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  4. #4
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    Oui pardon, je n'ai pas était très clair sur le résultat.
    Lorsque je filtre avec les trois premières conditions, tout fonctionne comme je veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    where (EventStamp BETWEEN  '2017-05-26 00:00:01'  AND  '2017-06-26 00:00:01' )  
    		AND NOT (TagName Like '%Flag%')
    		AND NOT (TagName Like '%_TMP_%')
    La requêtre filtre bien le sur les dates demandées et avec les TagName en moins.

    En rajoutant la dernière condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND NOT (TagName Like '%AL' AND value = 'true')
    je me retrouve avec un résultat qui ne colle plus à ce que je veux.
    J'ai des TagName qui contiennent 'Flag' et '_TMP_' parce-qu’en face la colonne value est à true...

    Je ne vois pas comment ajouter le dernier filtre :
    • TagName ne termine pas par 'AL' uniquement si value est différent de True


    Vous n'aurriez pas une idée du coup ?


    Citation Envoyé par al1_24 Voir le message
    "ça ne fonctionne pas" n'est pas un message d'erreur.

    Que se passe-t-il lorsque tu ajoutes cette dernière condition ?
    Je n'ai que les résultats avec value = true, mes autres filtres ne sont plus pris en compte.
    Un message d'erreur ? Lequel ?
    Je n'ai aucun message d'erreur
    Un comportement inattendu ? Donne-nous un exemple.
    Non pas de comportement inattendu. Je pense juste que je me suis trompé dans la requête, mais je ne vois pas comment la faire.

    Ce qui pourrait aider aussi à a résolution de ton problème, c'est de connaître la structure de ta table et en particulier le type de la colonne value.
    A part la première colonne EventStamp, ce ne sont que des colonnes qui contienne du texte
    Citation Envoyé par hmira Voir le message
    Bonjour,

    En plus ce qui a été demandé, à juste titre, par al1_24, ci-dessous deux questions subsidiaires :

    1 - Le dernier critère c'est "Ne contient pas 'AL'" ou bien "Ne finit pas par 'AL'". Parce que tel que c'est traduit dans la requête SQL, cela signifie plutôt "Ne finit par par 'AL'" (?) il y a donc contradiction avec l'énoncé initial.
    Non effectivement tu as raison. C'est ne se finit pas par 'AL'

    2 - Est-ce que,, dans l'expression SQL (TagName Like '%_TMP_%') (c.à.d TagName ne contient pas '_TMP_'), le caractère souligné '_' fait partie du texte (ou littéral) recherché ou bien il est utilisé en tant caractère générique ?
    Oui, les caractères '_' font parti du texte recherché mais ne posent pas de soucis à première vue dans la requête.
    Attention : Les caractères '_', '%' et '[', ']', '^' ,.. sont des caractères "génériques" et ils sont interprétés de manière bien particulière par le moteur SQL.


    Si le caractère souligné '_' fait réellement partie du texte (ou littéral) recherché, alors il vous faudra fournir un caractère d'échappement et faire précéder chaque caractère souligné '_' par le dit caractère d'échappement. Sinon le résultat peut être faux !
    Ok, je vais regarder les cratère générique et ajouter un caractère d'échappement au besoin

    A+

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    • TagName ne termine pas par 'AL' uniquement si value est différent de True

    se traduit par
    AND (TagName Not Like '%AL' OR value = 'true')ou
    AND not (TagName Like'%AL' ANDvalue <>'true')
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  6. #6
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonsoir LinKin,

    Merci pour ta réponse. j'ai essayé un peut tout, mais ça ne fonctionne pas dès que tu as une condition avant ...
    Les deux équations que tu m'a donné ne produisent pas le même résultat. Et c'est normal.

    Si on traduit en équation booléenne, on le voit vite.

    Pour "AND NOT (TagName Like'%AL' AND value <>'true')"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ( (EventStamp BETWEEN  '2017-05-26 00:00:01'  AND  '2017-06-26 00:00:01' ) AND NOT(TagName Like'%AL' AND value <>'true'))
    Si je remplace les contions par des X :

    X1 = EventStamp BETWEEN '2017-05-26 00:00:01' AND '2017-06-26 00:00:01'
    X2 = TagName Like '%AL'
    X3 = value <>'true'

    Cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHERE ( X1 AND NOT (X2 AND X3))
     
    /* ce qui revient à */
    WHERE ( X1 AND (NOT X2 OR NOT X3))
     
    /* Le AND deviennent prioritaire et on a ça ... */
    WHERE ( X1 AND NOT X2 OR NOT X3)
    Et du coup, on à la condition X3 passe en parallèle de X1 et X2 et ne tient plus compte du filtre sur la colonne EventStamp et TagName ...
    Je ne sais pas si je suis clair mais au final le résultat ne colle pas dès que j'ai une condition sur deux colonnes en même temps.

    Au final, je me demande si j'utilise la bonne méthode...
    Il y a peut-être mieux a faire mais je ne sais pas trop comment. Je ne connais que la méthode simple en SQL.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Voici la clause WHERE qu'il vous faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE  EventStamp BETWEEN '2017-05-26 00:00:01' AND '2017-06-26 00:00:01'
       AND TagName NOT LIKE '%Flag%'
        AND TagName NOT LIKE  '%?_TMP?_%' ESCAPE '?'
        AND CASE WHEN VALUE <> 'True' AND TagName NOT LIKE '%AL%' THEN 1
    	         WHEN VALUE = 'True' THEN 1
    			 ELSE 0 END  = 1

    Et pour apprendre le SQL :
    Nom : Couverture SQL Synthex 4e ed - 500.jpg
Affichages : 704
Taille : 77,8 Ko

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

  8. #8
    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
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* Le AND deviennent prioritaire et on a ça ... */
    WHERE ( X1 AND NOT X2 OR NOT X3)
    Non, le AND est bien prioritaire. Donc cette dernière ligne revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ( (X1 AND NOT X2) OR NOT X3)
    , ce qui est tout à fait différent.


    En rajoutant la dernière condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND NOT (TagName Like '%AL' AND value = 'true')
    je me retrouve avec un résultat qui ne colle plus à ce que je veux.
    J'ai des TagName qui contiennent 'Flag' et '_TMP_' parce-qu’en face la colonne value est à true...
    L'avez vous vraiment écrite telle quelle, ou avez vous appliqué la transformation ci-dessous.
    Car normalement, c'est correct écrit ainsi, et vous ne devriez pas voir revenir les lignes filtrées par les conditions précédentes !

    L'idéal pour faire gagner du temps a tout le monde serait un jeu d'essai, avec les résultats voulus et ceux obtenus...

    Par ailleurs, avez vous des NULL dans l'une des colonnes impliquée dans la clause WHERE ?

Discussions similaires

  1. Problème pour une requête SQL
    Par bombers dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/01/2015, 13h09
  2. problème de syntaxe dans une requête SQL
    Par nutopia dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/11/2010, 17h17
  3. [AC-2007] Problème de syntaxe pour une formule SQL en VBA
    Par franckimmo dans le forum IHM
    Réponses: 4
    Dernier message: 12/02/2010, 10h54
  4. problème de syntaxe avec une requête SQL
    Par funkyjul dans le forum Développement
    Réponses: 4
    Dernier message: 27/10/2008, 21h15
  5. problème de syntaxe delphi pour une requête sql
    Par socooooool dans le forum Bases de données
    Réponses: 12
    Dernier message: 07/07/2006, 16h53

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