2013-02-26 10 views
26

Sto cercando di trovare i record che contengono una stringa di 6 o più caratteri alfanumerici in maiuscolo. Alcuni esempi:Come si esegue una ricerca con distinzione tra maiuscole e minuscole utilizzando LIKE?

PENDING 3RDPARTY CODE27 

sto usando la seguente dichiarazione:

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]%'; 

Questo sta tornando tutti i record che contengono qualsiasi parola 6-o-più-lettera, a prescindere dal caso.

Ho una dichiarazione COLLATE:

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]%'; 

Questo non cambia nulla. Restituisce ancora i record con una parola di 6 o più lettere, indipendentemente dal caso.

Proprio come un test, ho provato:

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%'; 

Entrambi questi lavorato, tornando i record contenenti "in sospeso" e "in sospeso", rispettivamente. Quindi il problema sembra dal modello di corrispondenza del modello LIKE.

Cosa posso fare per eseguire questa ricerca con distinzione tra maiuscole e minuscole?

+6

provare a utilizzare COLLARE Latin1_General_BIN –

+0

Perfetto! Vuoi fare una risposta? –

+1

Perché? Per ottenere alcuni punti. Mi piace la soddisfazione sapere che ho aiutato. –

risposta

36

Provare a utilizzare COLLATE Latin1_General_BIN piuttosto che COLLATE Latin1_General_CS_AS

26

aggiornamento a causa di @GeraldSv: utilizzare il confronto 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; 

è necessario inserire l'identificatore di collazione dopo la stringa da abbinare, piuttosto che la colonna:

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; 

Aggiornamento : Mentre la mia risposta sopra è corretta, c'è un bug archiviato in Connect: Case-SENSITIVITY doesn't work when using a range in like with COLLATE Latin1_General_CS_AS che Microsoft ha contrassegnato come 'By Design'.

ho verificato utilizzando AdventureWorks2008R2 (case insensitive, fuori dalla scatola di default), nella tabella Person.Person ho cambiato 3 ultimi nomi che terminano in 'n' a 'N', e poi corse le seguenti interrogazioni:

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

Successo. Restituisci 3 file come previsto.

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

Successo. Restituisci 3 file come previsto.

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

Successo. Restituisci 3 file come previsto.

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

Errore.Consegne 3334 Righe (che sta finendo tutto del Cognome nella 'n' e 'N')

Update: Grazie per @GeraldSv, questo funziona:

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

Grazie per tutte le ricerche! –

0

I utilizzare il seguente:

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