2009-08-03 13 views

Respuesta

103

En la configuración predeterminada de una base de datos de SQL Server, las comparaciones de cadenas son insensibles a mayúsculas y minúsculas. Si su base de datos anula esta configuración (mediante el uso de una intercalación alternativa), deberá especificar qué tipo de colación usar en su consulta.

SELECT * FROM myTable WHERE myField = 'sOmeVal' COLLATE SQL_Latin1_General_CP1_CI_AS 

Tenga en cuenta que la colación que he proporcionado es sólo un ejemplo (aunque más que probable que la función de bien para usted). Se puede encontrar un esquema más completo de las intercalaciones de SQL Server here.

2

Qué base de datos está usted? Con MS SQL Server, es una configuración de toda la base de datos, o puede sobrepasarla por consulta con la palabra clave COLLATE.

25

Normalmente, las comparaciones de cadenas no distinguen entre mayúsculas y minúsculas. Si su base de datos está configurado para la intercalación sensible, es necesario obligar a utilizar un caso insensible uno:

SELECT balance FROM people WHERE email = '[email protected]' 
    COLLATE SQL_Latin1_General_CP1_CI_AS 
+3

Parece que alguien es más rápido que yo :-) –

+4

+1 Me gustó su respuesta breve (y sin desplazamiento de la barra de desplazamiento). –

4

puede forzar la mayúsculas y minúsculas, echando a un varbinary así:

SELECT * FROM myTable 
WHERE convert(varbinary, myField) = convert(varbinary, 'sOmeVal') 
+2

Si bien esto es funcional, no es un enfoque recomendable. Las intercalaciones están ahí para gestionar la ordenación y las comparaciones de cadenas. –

+0

@AdamRobinson no es esto acerca de "comparaciones de cadenas" sin embargo? – Fandango68

19

I encontró otra solución en otro lugar; es decir, utilizar

upper(@yourString) 

pero aquí todo el mundo está diciendo que, en SQL Server, no importa porque está ignorando el caso de todos modos? Estoy bastante seguro de que nuestra base de datos distingue entre mayúsculas y minúsculas.

+4

Tiene razón en que una base de datos puede hacerse sensible a mayúsculas y minúsculas, pero esto es bastante ineficiente, incluso si es necesario. COLLATE es la palabra clave para usar. – mjaggard

+1

Gracias por mencionarlo, @mjaggard. Espero que usted, o cualquiera que parezca menospreciar mi respuesta, elabore por el bien de alguien como yo que busca y encuentra respuestas como la mía. – Danny

+1

Upvoted esto ya que es una explicación perfectamente racional. Intercalar huele demasiado y ¿qué pasa si su cadena tiene caracteres que la intercalación no comprende? Latin 1 es un esquema de codificación pésimo.Buena suerte obteniendo resultados significativos si su cadena tiene un apóstrofo (Like: O'Brien). – eggmatters

5

No, solo con LIKE no funcionará. LIKE busca valores que coincidan exactamente con su patrón dado. En este caso, LIKE encontraría solo el texto 'sOmeVal' y no 'someval'.

Una solución práctica utiliza la función LCASE(). LCASE('sOmeVal') obtiene la cadena minúscula de su texto: 'someval'. Si utiliza esta función para ambos lados de la comparación, funciona:

SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')

La declaración compara dos cadenas minúsculas, por lo que su 'sOmeVal' coincidirá con cualquier otra notación de 'someval' (por ejemplo, 'Someval ',' ALGUNOS ', etc.).

+6

En el 99.9% de las instalaciones de SQL Server que se recopilan _CI, LIKE no distingue entre mayúsculas y minúsculas. – RichardTheKiwi

Cuestiones relacionadas