9
votes

Comment la plage de caractères génériques SQL Server Server, par exemple [A-D], fonctionne avec une assiette sensible à la casse?

Quelqu'un peut-il expliquer les règles de la plage de caractères génériques, par exemple [AD], fonctionne avec une assiette sensible à la casse?

J'aurais pensé le suivant P>

CREATE TABLE #TEST_LIKE_Patterns
    ( 
        ID INT IDENTITY(1,1),
        CharColumn VARCHAR(100) COLLATE Latin1_General_CS_AS
    );

--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('aaa'), ('aAA'), ('AAA'), ('Aaa');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('bbb'), ('bBB'), ('BBB'), ('Bbb');
--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ccc'), ('cCC'), ('CCC'), ('Ccc');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ddd'), ('dDD'), ('DDD'), ('Ddd');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('eee'), ('eEE'), ('EEE'), ('Eee');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('fff'), ('fFF'), ('FFF'), ('Fff');
--------------

-- Raw Data:
SELECT *
FROM #TEST_LIKE_Patterns;

SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[A-D]%';

-- Results:
/*
ID   CharColumn
--------------
3    AAA
4    Aaa
5    bbb
6    bBB
7    BBB
8    Bbb
9    ccc
10   cCC
11   CCC
12   Ccc
13   ddd
14   dDD
15   DDD
16   Ddd
*/


SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[ABCD]%';    

-- Results:
/*
ID   CharColumn
    --------------
3    AAA
4    Aaa
7    BBB
8    Bbb
11   CCC
12   Ccc
15   DDD
16   Ddd
*/


0 commentaires

4 Réponses :


3
votes

Essayez

SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn  LIKE '[A-D]%' COLLATE Latin1_General_BIN;


0 commentaires

0
votes

Utiliser une collation sensible à la casse fonctionne pour les chaînes de recherche qui ne sont pas dans une plage par ex. Cela fonctionnerait:

SELECT *
  FROM #TEST_LIKE_Patterns
 WHERE (
        CharColumn LIKE 'A%' COLLATE Latin1_General_CS_AS
        OR CharColumn LIKE 'B%' COLLATE Latin1_General_CS_AS
        OR CharColumn LIKE 'C%' COLLATE Latin1_General_CS_AS
        OR CharColumn LIKE 'D%' COLLATE Latin1_General_CS_AS
       );


2 commentaires

Assembler latin1_general_cs_as est utilisé lors de la création de la table et qui ne fonctionne pas, votre requête fournit le même résultat (pas de changement).


@ Md.ELIASHOSSAIN: Merci, je n'ai pas testé correctement. Maintenant mis à jour.



10
votes

Cela peut être fait de toute une manière:

a. Utilisez Assembler tout en créant la table comme suit: xxx

b. Utilisez rassembler lors de la sélection des données comme xxx


2 commentaires

Merci, je ne savais pas que vous pourriez spécifier la classement dans une clause où. Ce sera le plus utile lors de la recherche de bases de données que je n'ai pas conçues. En outre, je n'avais pas pensé utiliser une collation binaire au lieu d'une casse sensible à la casse. Bravo, Simon


Utilisation de Latin1_General_bin au lieu de Latin1_general_cs_as a fonctionné pour moi



11
votes

Vous avez besoin d'une assemblée binaire comme indiqué dans MD. Réponse de Hossain Elias .

L'explication est que les plages de la syntaxe de modèle fonctionnent des règles d'ordre de tri de collation. P>

de Bol P>

Recherches dans la plage, les caractères inclus dans la plage peuvent varier en fonction des règles de tri de la classement. P> blockQuote>

SO P>

C
----
a
A
b
B
c
C
d
D


1 commentaires

Merci, cela répond parfaitement à ma question. J'essayais de comprendre la logique derrière les résultats apparemment arbitraires d'une recherche de portée. C'est très clair maintenant. Bravo, Simon.