SQL: ignorar mayúsculas y minúsculas mientras busca una cadena


130


Tengo los siguientes datos en una tabla
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

En SQL necesito escribir una consulta que busca una cadena en una tabla. Mientras busca una cadena, debe ignorar mayúsculas y minúsculas. Para la consulta SQL mencionada a continuación

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

da todos los datos anteriores, mientras que

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

no da

P.ej. cuando busco 'PriceOrder' o 'priceOrder' funciona, pero 'priceorder' o 'Priceorder' no funcionan. He intentado con la consulta a continuación usando COLLATE, pero no funciona. Hazme saber a dónde voy mal.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

Respuestas:


233

Usa algo como esto:

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

o

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

14
Creo que siempre debe comparar cadenas en mayúscula (SUPERIOR) como mejor práctica. Google "turco i"
Traubenfuchs

2
¿Quiere saber si su respuesta tiene algún problema de rendimiento al convertir un valor de columna UPPERo un LOWERcaso y luego usar la LIKEbúsqueda?
shaijut

En realidad, tendría que comparar las variantes SUPERIOR e INFERIOR porque algunos caracteres tienen diferentes representaciones en mayúsculas pero la misma representación en minúsculas. Para otros personajes, lo contrario puede ser cierto. Java menciona el alfabeto georgiano específicamente como razón para hacer un toLowerCase () adicional en su comparación que no distingue entre mayúsculas y minúsculas.
Crusha K. Rool

1
Desafortunadamente, este enfoque causa un escaneo completo de la tabla como se describe en esta publicación: alvinalexander.com/sql/… . No se puede aplicar una búsqueda de índice, ya que la columna filtrada es modificada por la función SUPERIOR / INFERIOR.
Jeff S.

Establecer una intercalación (antes de crear el índice) parece ser el mejor enfoque si el rendimiento de la consulta con superior / inferior no es suficiente.
Jeff S.

10

Vea esta pregunta y respuesta similar a la búsqueda con mayúsculas y minúsculas: el servidor SQL ignora las mayúsculas y minúsculas en una expresión where

Intenta usar algo como:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

no funciona, obtengo que la consulta SQL no finalizó correctamente antes de clasificar
shockwave

@ Miguel-F ... funciona bien, pero ¿en qué se diferencia de SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '% priceorder%' porque esto también funciona bien para mí?
Jishant

Yo recomendaría usar 'SQL_Latin1_General_Cp1_CI_AS_KI_WI' en su lugar. No es caso sensible para una búsqueda.
user8155123

8

Me gusta esto.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

En postgresql.


44
Esta pregunta está etiquetada como sql-server, por lo que una respuesta de postgres no es relevante.
Liam

4

Probablemente deberías usar SQL_Latin1_General_Cp1_CI_AS_KI_WIcomo tu cotejo. El que especifique en su pregunta es explícitamente sensible a mayúsculas y minúsculas.

Puedes ver una lista de colaciones aquí .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.