2013-02-26 12 views
26

Ich versuche, Datensätze zu finden, die eine Zeichenfolge aus 6 oder mehr alphanumerischen Zeichen in Großbuchstaben enthalten. Einige Beispiele:Wie führe ich eine Groß- und Kleinschreibung mit LIKE durch?

PENDING 3RDPARTY CODE27 

Ich verwende die folgende Anweisung:

SELECT Details 
FROM MyTable 
WHERE Details LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

Dies wird alle Datensätze zurückkehrt, die ein beliebiges 6-oder-mehr-Buchstaben-Wort, und zwar unabhängig von Fall.

Ich habe eine COLLATE Erklärung hinzugefügt:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

Dies ändert sich nichts. Es gibt immer noch Datensätze mit einem Wort aus 6 oder mehr Buchstaben zurück, unabhängig von der Groß-/Kleinschreibung.

Nur als Test habe ich versucht:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%pending%'; 

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%PENDING%'; 

beide gearbeitet, Rückkehr Aufzeichnungen "pending" und "PENDING" jeweils enthalten. So scheint das Problem von LIKE Claus Mustervergleich.

Was kann ich tun, um diese Suche nach Groß-/Kleinschreibung durchzuführen?

+6

versuchen Sie mit COLLATE Latin1_General_BIN –

+0

Perfekt! Willst du das beantworten? –

+1

Warum? Um ein paar Punkte zu bekommen. Ich mag einfach die Befriedigung zu wissen, dass ich geholfen habe. –

Antwort

36

Versuchen Sie es mit COLLATE Latin1_General_BIN statt COLLATE Latin1_General_CS_AS

26

-Update aufgrund @GeraldSv: Verwenden Sie eine Sortierung Latin1_General_BIN

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_BIN; 

Sie benötigen die Sortierung Spezifizierer nach die Zeichenfolge platzieren eher angepasst werden als die Spalte:

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_CS_AS; 

-Update : Während meine obige Antwort richtig ist, gibt es einen Fehler bei Connect: Case-SENSITIVITY doesn't work when using a range in like with COLLATE Latin1_General_CS_AS, den Microsoft als "By Design" markiert hat.

I unter Verwendung von AdventureWorks2008R2 (Groß- und Kleinschreibung, aus der Box Standard) überprüft, in der Person.Person Tabelle I 3 Nachnamen geändert in ‚n‘ auf ‚N‘ enden, und lief dann die folgenden Abfragen:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%N' COLLATE Latin1_General_CS_AS 

Erfolg. Geben Sie 3 Zeilen wie erwartet zurück.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS 

Erfolg. Geben Sie 3 Zeilen wie erwartet zurück.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS 

Erfolg. Geben Sie 3 Zeilen wie erwartet zurück.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS 

schlägt fehl.Returns 3334 Zeilen (die alle Ende der Nachname ist in 'n' und 'N')

Update: Dank @GeraldSv, das funktioniert:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN 
+0

Danke für die Recherche! –

0

I Verwenden Sie Folgendes:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS