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
*/
4 Réponses :
Essayez
SELECT * FROM #TEST_LIKE_Patterns WHERE CharColumn LIKE '[A-D]%' COLLATE Latin1_General_BIN;
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
);
Assembler latin1_general_cs_as code> 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.
Cela peut être fait de toute une manière:
a. Utilisez b. Utilisez Assembler code> tout en créant la table comme suit: p> rassembler code> lors de la sélection des données comme p>
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 code> au lieu de Latin1_general_cs_as code> a fonctionné pour moi
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
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.