Como posso escapar colchetes em uma cláusula LIKE?

237

Estou tentando filtrar itens com um procedimento armazenado usando o like. A coluna é um varchar (15). Os itens que estou tentando filtrar têm colchetes no nome.

Por exemplo: WC[R]S123456.

Se eu fizer um LIKE 'WC[R]S123456', não retornará nada.

Encontrei algumas informações sobre o uso da ESCAPEpalavra-chave, LIKEmas não entendo como usá-la para tratar os colchetes como uma sequência regular.

Travis
fonte

Respostas:

329
LIKE 'WC[[]R]S123456' 

ou

LIKE 'WC\[R]S123456' ESCAPE '\'

Deveria trabalhar.

Otávio Décio
fonte
10
A palavra-chave ESCAPE é necessária se você deseja usar um caractere de escape personalizado (a barra invertida é realmente personalizada).
quer
2
Corrigi também a outra parte da resposta. SQL Fiddle com versões anteriores e posteriores
Martin Smith
10
Se alguém não souber ao certo por que o colchete precisa ser escapado, a documentação de LIKE indica que ele é usado para corresponder a um único caractere em um intervalo ou conjunto. Por exemplo, o uso LIKE '[fz]oo'corresponderá a 'foo' e 'zoo'.
Holistic Developer
3
Seria bom ter uma justificativa para ambos na resposta. Não ficou imediatamente óbvio para mim por que o primeiro exemplo funcionaria até eu ler a resposta de Amitesh abaixo.
Don Jewett
1
Prefira LIKE 'WC\[R]S123456' ESCAPE '\', pois é mais legível para manutenção.
Fire Druid
119

Digamos que você queira corresponder ao literal its[brac]et.

Você não precisa escapar do, ]pois ele tem um significado especial apenas quando está emparelhado [.

Portanto, escapar [é suficiente para resolver o problema. Você pode escapar [ substituindo-o por [[] .

Amitesh
fonte
7
Isso foi realmente útil e foi a melhor resposta.
Jared Sol
1
[[]parece estranho, mas faz sentido quando você o olha da perspectiva do analisador. O analisador possui uma regra específica de como lidar com caracteres entre eles [ ]. Portanto, o texto its[brac]etsignifica: "Encontre as seguintes seqüências consecutivas:, its(aplique a regra entre colchetes:) brac, et" . Por outro lado, its[[]brac]etsignifica: "Encontre as seguintes seqüências consecutivas:, its(aplique a regra entre colchetes:) [, brac]et" .
25718 Brian
28

Eu precisava excluir nomes que começassem com um sublinhado de uma consulta, então acabei com isso:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
fonte
2
Eu tive que usar esta versão (especificando o caractere "escape" explicitamente) - as outras respostas aqui não deram os resultados corretos para mim.
Marce
20

Aqui está o que eu realmente usei:

like 'WC![R]S123456' ESCAPE '!'
Travis
fonte
15

A palavra-chave ESCAPE é usada se você precisar procurar caracteres especiais como% e _, que normalmente são curingas. Se você especificar ESCAPE, o SQL procurará literalmente os caracteres% e _.

Aqui está um bom artigo com mais alguns exemplos

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
escocês
fonte
6

Se você precisar escapar de caracteres especiais como '_' (sublinhado), como no meu caso, e não estiver disposto / não capaz de definir uma cláusula ESCAPE, convém incluir o caractere especial entre colchetes '[ ' e '] ' .

Isso explica o significado da string "estranha" '[[]' - ela apenas abraça o caractere '[' entre colchetes, escapando-o efetivamente.

Meu caso de uso foi especificar o nome de um procedimento armazenado com sublinhados como um critério de filtro para o Profiler. Então, eu coloquei a string '% name [_] de [_] um [_] procedimento armazenado [_]%' em um campo TextData LIKE e isso me deu resultados de rastreamento que eu queria alcançar.

Aqui está um bom exemplo da documentação: LIKE (Transact-SQL) - Usando caracteres curinga como literais

ssurba
fonte
4

De acordo com a documentação :

Você pode usar os caracteres correspondentes do padrão curinga como caracteres literais. Para usar um caractere curinga como um caractere literal, coloque-o entre colchetes.

Você precisa escapar desses três caracteres %_[:

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true
Salman A
fonte
1

Em vez de '\' ou outro caractere no teclado, você também pode usar caracteres especiais que não estão no teclado. Dependendo do seu caso de uso, isso pode ser necessário, se você não desejar que a entrada do usuário seja acidentalmente usada como caractere de escape.

Rob Breidecker
fonte
2
Costumo usar ¬- ainda é um personagem de teclado no Reino Unido, mas raramente usado conscientemente :) (canto superior esquerdo entre Esce Tab)
Andi Mohr
Os usuários ainda podem enviar dados contendo letras que não estão no teclado. Esta resposta parece muito com uma sugestão para evitar realmente resolver o problema ...
Binki
0

Use a seguir.

Para que a entrada do usuário pesquise como está, use escape, pois exigirá a substituição a seguir de todos os caracteres especiais (abaixo, abrange todo o SQL Server).

Aqui, aspas simples "'" não são usadas, pois não afetam a cláusula like, pois é uma questão de concatenação de cadeias.

A substituição "-" & "^" & "]" não é necessária, pois estamos escapando de "[".

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

Em seguida, no SQL Query, deve ser o seguinte. (Na consulta parametrizada, a cadeia pode ser adicionada com padrões após a substituição acima).

Para pesquisar a string exata.

like 'FormattedString' ESCAPE 'ð'

Para pesquisar iniciar com string

like '%FormattedString' ESCAPE 'ð'

Para pesquisar final com string

like 'FormattedString%' ESCAPE 'ð'

Para pesquisar conter com sequência

like '%FormattedString%' ESCAPE 'ð'

e assim por diante para outras correspondências de padrões. Mas a entrada direta do usuário precisa formatar como mencionado acima.

Criador anônimo
fonte
0

Há um problema nisso enquanto:

LIKE 'WC[[]R]S123456' 

e:

LIKE 'WC\[R]S123456' ESCAPE '\'

Ambos funcionam para o SQL Server, mas nem para Oracle.

Parece que não existe uma maneira ISO / IEC 9075 de reconhecer um padrão envolvendo uma cinta esquerda.

questaware
fonte