sql-server-2008 - ejemplos - mysql like mayusculas y minusculas
¿Cómo realizo una búsqueda que distingue entre mayúsculas y minúsculas utilizando LIKE? (3)
Intente usar COLLATE Latin1_General_BIN
lugar de COLLATE Latin1_General_CS_AS
Estoy tratando de encontrar registros que contengan una cadena de 6 o más caracteres alfanuméricos en mayúsculas. Algunos ejemplos:
PENDING 3RDPARTY CODE27
Estoy usando la siguiente declaración:
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]%'';
Esto es devolver todos los registros que contienen cualquier palabra de 6 o más letras, independientemente del caso.
He añadido una declaración 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]%'';
Esto no cambia nada. Todavía devuelve registros con una palabra de 6 o más letras, independientemente del caso.
Solo como una prueba, probé:
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%'';
Ambos trabajaron, devolviendo registros que contienen "pendiente" y "PENDIENTE" respectivamente. Así que el problema parece por la coincidencia de patrón de LIKE
claus.
¿Qué puedo hacer para realizar esta búsqueda que distingue entre mayúsculas y minúsculas?
Yo uso lo siguiente:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS
Actualización debido a @GeraldSv : Use 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;
Debe colocar el especificador de intercalación después de la cadena que debe coincidir en lugar de la columna:
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;
Actualización: Si bien mi respuesta anterior es correcta, hay un error registrado en Connect: Case-SENSITIVITY no funciona cuando se utiliza un rango similar con COLLATE Latin1_General_CS_AS que Microsoft ha marcado como ''Por diseño''.
Verifiqué utilizando AdventureWorks2008R2 (no distingue mayúsculas de minúsculas, fuera de la caja por defecto), en la tabla Person.Person Cambié 3 últimos apellidos que terminaron en ''n'' a ''N'', y luego ejecuté las siguientes consultas:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE ''%N'' COLLATE Latin1_General_CS_AS
Éxito. Devuelve 3 filas como se esperaba.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE ''%[N]'' COLLATE Latin1_General_CS_AS
Éxito. Devuelve 3 filas como se esperaba.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE ''%[N-N]'' COLLATE Latin1_General_CS_AS
Éxito. Devuelve 3 filas como se esperaba.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE ''%[M-N]'' COLLATE Latin1_General_CS_AS
Falla Devuelve 3334 filas (que son todos los apellidos que terminan en ''n'' y ''N'')
Actualización: Gracias a @GeraldSv, esto funciona:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE ''%[M-N]'' COLLATE Latin1_General_BIN