SQL - Ignorar maiúsculas e minúsculas ao procurar uma string


130


Eu tenho os seguintes dados em uma tabela
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

No SQL, preciso escrever uma consulta que procure por uma string em uma tabela. Ao procurar por uma string, ela deve ignorar maiúsculas e minúsculas. Para a consulta SQL mencionada abaixo

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

fornece todos os dados acima, enquanto

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

não dá.

Por exemplo. quando procuro por 'PriceOrder' ou 'priceOrder', ele funciona, mas 'priceorder' ou 'Priceorder' não funciona. Eu tentei com a consulta abaixo usando COLLATE, mas não está funcionando. Deixe-me saber onde estou errado.

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

Respostas:


232

Use algo como isto -

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

ou

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

14
Eu acho que você deve sempre comparar cadeias maiúsculas (UPPER) como melhor prática. Google "i turco"
Traubenfuchs 18/04/14

2
Gostaria de saber se sua resposta tem algum problema de desempenho convertendo um valor de coluna para UPPERou LOWERcaso e usando a opção LIKEpara pesquisar?
shaijut

Na verdade, você teria que comparar as variantes UPPER e LOWER, porque alguns caracteres têm representações diferentes em maiúsculas, mas a mesma representação em minúsculas. Para outros caracteres, o oposto pode ser verdadeiro. Java menciona o alfabeto georgiano especificamente como motivo para fazer um toLowerCase () adicional em sua comparação sem distinção entre maiúsculas e minúsculas.
Crusha K.Rool

1
Infelizmente, essa abordagem causa uma verificação completa da tabela, conforme descrito neste post: alvinalexander.com/sql/… . Uma pesquisa de índice não pode ser aplicada, pois a coluna filtrada é modificada pela função UPPER / LOWER.
Jeff S.

Definir um agrupamento (antes de criar o índice) parece ser a melhor abordagem se o desempenho da consulta com superior / inferior não for suficiente.
Jeff S.

10

Consulte esta pergunta semelhante e responda à pesquisa com distinção entre maiúsculas e minúsculas - SQL Server ignorar maiúsculas e minúsculas em uma expressão where

Tente usar algo como:

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

ele di não trabalhar eu recebo consulta SQL não devidamente terminado antes Agrupar
onda de choque

@ Miguel-F .. ele está funcionando bem, mas como é que diferem de COL_NAME DISTINCT SELECT FROM myTable ONDE COL_NAME LIKE '% priceorder%' porque esta multa também está trabalhando para mim ..
Jishant

Eu recomendaria usar 'SQL_Latin1_General_Cp1_CI_AS_KI_WI'. Não é sensível a maiúsculas e minúsculas para uma pesquisa.
user8155123

8

Como isso.

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

No postgresql.


4
Esta questão está etiquetada como sql-server, portanto, uma resposta do postgres não é relevante.
Liam

4

Você provavelmente deve usar SQL_Latin1_General_Cp1_CI_AS_KI_WIcomo seu agrupamento. O que você especificar em sua pergunta é explicitamente sensível a maiúsculas e minúsculas.

Você pode ver uma lista de agrupamentos aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.