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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top