Como posso escapar de suportes quadrados em uma cláusula do tipo?
-
22-07-2019 - |
Pergunta
Estou tentando filtrar itens com um procedimento armazenado usando como. A coluna é um Varchar (15). Os itens que estou tentando filtrar têm suportes quadrados no nome.
Por exemplo: WC[R]S123456
.
Se eu fizer um LIKE 'WC[R]S123456'
Não retornará nada.
Eu encontrei algumas informações sobre o uso do ESCAPE
palavra -chave com LIKE
Mas não entendo como usá -lo para tratar os colchetes como uma corda regular.
Solução
LIKE 'WC[[]R]S123456'
ou
LIKE 'WC\[R]S123456' ESCAPE '\'
Deveria trabalhar.
Outras dicas
Digamos que você queira combinar com o literal its[brac]et
.
Você não precisa escapar do ]
como tem significado especial apenas quando é emparelhado com [
.
Portanto, escapando [
basta resolver o problema. Você pode escapar [
substituindo -o por [[]
.
Eu precisava excluir nomes que começaram com um sublinhado de uma consulta, então acabei com isso:
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character
Aqui está o que eu realmente usei:
like 'WC![R]S123456' ESCAPE '!'
A palavra -chave Escape é usada se você precisar pesquisar caracteres especiais como % e _, que normalmente são curingas. Se você especificar Escape, o SQL pesquisará 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 '\'
Se você precisaria escapar de personagens especiais como '_' (sublinhado), como estava no meu caso, e você não está disposto/não capaz de definir uma cláusula de fuga, você pode querer incluir o personagem especial com colchetes quadrados '[' e ']'.
Isso explica o significado da corda "estranha" '[[]' - apenas abraça o '[' Personagem com colchetes, escape efetivamente.
Meu caso de uso foi especificar o nome de um procedimento armazenado com sublinhado como um critério de filtro para o Profiler. Então eu coloquei string '%Nome [_] de [_] a [_] armazenado [_] procedimento%' Em um campo de texto como o campo e me deu resultados de rastreamento que eu queria alcançar.
Aqui está um bom exemplo da documentação:Como (transact -sql) - usando caracteres curinga como literais
De acordo com documentação:
Você pode usar os personagens que correspondem ao padrão curinga como caracteres literais. Para usar um personagem curinga como um personagem literal, inclua o personagem curinga entre parênteses.
Você precisa escapar desses três personagens %_[
:
'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
Em vez de '' ou outro personagem 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 quiser que a entrada do usuário seja acidentalmente usada como um caractere de fuga.
Use a seguir.
Para obter a entrada do usuário para pesquisar como é, use Escape, pois exigirá a substituição seguinte para todos os caracteres especiais (abaixo cobre todo o SQL Server).
Aqui, uma única citação "'" não é tomada, pois não afeta como a cláusula, pois é uma questão de concatenação de string.
"-" & "^" & "] Substitua não é necessária, pois estamos escapando [".
String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");
Então, na consulta SQL, deve ser o seguinte. (Na consulta parametrizada, a string pode ser adicionada com padrões após a substituição acima).
Para pesquisar a string exata.
like 'FormattedString' ESCAPE 'ð'
Para pesquisar, inicie com string
like '%FormattedString' ESCAPE 'ð'
Para pesquisar com o final com string
like 'FormattedString%' ESCAPE 'ð'
Para pesquisar contém com string
like '%FormattedString%' ESCAPE 'ð'
E assim por diante para outra correspondência de padrões. Mas a entrada direta do usuário precisa formatar como mencionado acima.