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 :

Requête LIKE : problème incompréhensible sur [A-Z]


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut Requête LIKE : problème incompréhensible sur [A-Z]
    Bonjour

    J'ai une table contenant des codes de devises de type AUD, CAD, EUR, USD, ZAR en collation CS_AI
    Observez bien le résultats des requêtes suivantes :
    select * from table where devise like '[ABC]%' : AUD, CAD
    select * from table where devise like '[ACZ]%' : AUD, CAD
    select * from table where devise like '[AZC]%' : AUD
    select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD
    select * from table where devise like '[A-Z]%' : rien
    select * from table where devise like '[Z]%' : ZAR

    mais
    select * from table where devise like '[A-Z]%' COLLATE CS_AS : tout

    Quelqu'un saurait-il pourquoi le Z pose problème dans la requête en CS_AI ?

    Que faire pour résoudre ce problème ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Quelle est la collation de la colonne devise dans la table ?

    C'est cela qui te guidera vers la solution.

    De plus la collation CS_AS n'existe pas. Il faut la langue !

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

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci de ta réponse, et au temps pour moi, j'ai été un peu rapide dans mon exposé.
    La table (et le champ) sont en Latin1_General_CI_AS, et la requête fonctionne si on précise COLLATE Latin1_General_CS_AS

    Ce qui me surprend, c'est que la lettre Z n'a pas de raison d'être sensible aux accents, si ?

  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 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    C'est une problématique de classement due à la lange latine dans laquelle les accents n'existent pas....

    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 éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    D'accord, mais pourquoi cela a-t-il un impact sur ma requête ? Je n'ai pas d'accents dans ma table, ni dans mes critères de requête.
    En fait, j'aimerais surtout comprendre pourquoi je n'ai pas de résultat (ou des résultats tronqués) avec

    select * from table where devise like '[A-Z]%' : rien
    ni avec
    select * from table where devise like '[AZC]%' : AUD
    alors que j'en ai avec
    select * from table where devise like '[A-Y]%' : AUD, CAD, EUR, USD

    Se pourrait-il que le Z ait une signification particulière en Latin1_General ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Points : 36
    Points
    36
    Par défaut
    J'ai fais le test suivant en remplaçant XXX successivement par :
    Latin1_General_CI_AS
    Latin1_General_CS_AS
    Latin1_General_CI_AI
    Latin1_General_CS_AI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create table t (d CHAR(3) collate XXX)
     
    insert t (d) values ('AUD')
    insert t (d) values ('CAD')
    insert t (d) values ('EUR')
    insert t (d) values ('USD')
    insert t (d) values ('ZAR')
     
    select * from t where d like '[A-Z]%' 
     
    drop table t
    A chaque fois, le SELECT me renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AUD
    CAD
    EUR
    USD
    ZAR
    Donc pour moi, tout fonctionne très bien. Désolé mais je ne vois pas d'où cela peut venir.

    ________________________________
    Seminoque, créateur de
    http://www.bingokaz.com

  7. #7
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci pour tes tests. Ton code renvoie bien la même chose que pour toi si le champ n'est pas indexé.

    Par contre, si le champ devise est indexé (ou clé primaire), mon problème réapparaît, quelque soit la collation du champ (Latin1_General_CS_AI ou Latin1_General_CS_AS), mais ça marche en Latin1_General_BIN.

    Le fait d'indexer le champ a-t-il un impact sur la collation (collation implicite, ou un truc dans le genre ?). Ou faut-il définir la collation de l'index en plus de celle du champ ?

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Intéressant, il ne s'agit pas d'un problème de collation, mais d'un problème de plan d'exécution. Si tu as un index, SQL Server choisit un seek, avec un prédicat étrange : un between A et B ... La raison pour laquelle ça marche sans index ou avec un COLLATE, c'est à cause du scan de la table (le COLLATE force le scan). Je vais investiguer pour voir d'où ça peut venir.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  9. #9
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Le comportement est comme tu le décris en SQL Server 2005 RTM, par contre c'est correct en SP2. As-tu un service pack installé ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  10. #10
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci d'avoir cherché, c'est en effet le RTM que nous avons.
    Je vais demander l'upgrade à notre admin (et allumer un cierge par la même occasion).
    En attendant, la clause '[ABCDE...XYZ]%' pourra toujours servir.

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

Discussions similaires

  1. [WD14] Problème incompréhensible sur une requête
    Par cladoo dans le forum WinDev
    Réponses: 4
    Dernier message: 16/09/2009, 11h42
  2. [SQL] Problème syntaxique sur requête SQL
    Par Velkan.nexus dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/10/2007, 07h11
  3. [BDD][Mysql] Problème récurant sur certaines requêtes
    Par citizen_yule dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/04/2006, 22h22
  4. probléme requête LIKE
    Par clara2005 dans le forum Requêtes
    Réponses: 14
    Dernier message: 13/03/2006, 23h55
  5. Problème: condition sur formulaire dans requête
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 23h27

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