¿Cómo puedo escapar de los corchetes en una cláusula LIKE?

237

Estoy tratando de filtrar elementos con un procedimiento almacenado usando like. La columna es un varchar (15). Los elementos que estoy tratando de filtrar tienen corchetes en el nombre.

Por ejemplo: WC[R]S123456.

Si hago un LIKE 'WC[R]S123456'no devolverá nada.

Encontré información sobre el uso de la ESCAPEpalabra clave LIKEpero no entiendo cómo usarla para tratar los corchetes como una cadena normal.

Travis
fuente

Respuestas:

329
LIKE 'WC[[]R]S123456' 

o

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

Deberia trabajar.

Otávio Décio
fuente
10
La palabra clave ESCAPE es necesaria si desea utilizar un carácter de escape personalizado (la barra diagonal inversa es personalizada).
Ryan Kohn
2
También corregí la otra parte de la respuesta. SQL Fiddle con versiones anteriores y posteriores
Martin Smith
10
Si alguien no tiene claro por qué se debe escapar el corchete, la documentación de LIKE indica que se utiliza para hacer coincidir un solo carácter en un rango o conjunto. Por ejemplo, el uso LIKE '[fz]oo'coincidirá con 'foo' y 'zoo'.
Desarrollador holístico
3
Sería bueno tener una justificación para ambos en la respuesta. No fue inmediatamente obvio para mí por qué el primer ejemplo funcionaría hasta que leí la respuesta de Amitesh a continuación.
Don Jewett
1
Prefiero LIKE 'WC\[R]S123456' ESCAPE '\'ya que es más legible para mantenimiento.
Fire Druid
119

Digamos que quieres hacer coincidir el literal its[brac]et.

No es necesario escapar del, ]ya que tiene un significado especial solo cuando está emparejado [.

Por lo tanto, escapar es [suficiente para resolver el problema. Puedes escapar [ reemplazándolo con [[] .

Amitesh
fuente
77
Esto fue realmente útil y la mejor respuesta.
Jared Sol
1
[[]parece extraño, pero tiene sentido cuando lo miras desde la perspectiva del analizador. El analizador tiene una regla específica sobre cómo manejar los caracteres intermedios [ ]. Entonces, el texto its[brac]etsignifica: "Encuentra las siguientes cadenas consecutivas:, its(aplica la regla para corchetes:) brac, et" . Por otro lado, its[[]brac]etsignifica: "Encuentra las siguientes cadenas consecutivas:, its(aplica la regla para corchetes:) [, brac]et" .
Brian
28

Necesitaba excluir nombres que comenzaron con un guión bajo de una consulta, así que terminé con esto:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
fuente
2
Tuve que usar esta versión (especificando explícitamente el carácter de "escape"). Las otras respuestas aquí no me dieron los resultados correctos.
MarcE
20

Esto es lo que realmente usé:

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

La palabra clave ESCAPE se usa si necesita buscar caracteres especiales como% y _, que normalmente son comodines. Si especifica ESCAPE, SQL buscará literalmente los caracteres% y _.

Aquí hay un buen artículo con algunos ejemplos más.

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

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
scottm
fuente
6

Si necesita escapar de caracteres especiales como '_' (guión bajo), como sucedió en mi caso, y no está dispuesto / no puede definir una cláusula ESCAPE, puede incluir el carácter especial entre corchetes '[ ' y '] ' .

Esto explica el significado de la cadena "extraña" '[[]' - simplemente abarca el carácter '[' entre corchetes, escapando efectivamente.

Mi caso de uso fue especificar el nombre de un procedimiento almacenado con guiones bajos como criterios de filtro para Profiler. Así que puse la cadena '% name [_] de [_] un [_] procedimiento [_] almacenado%' en un campo LIKE TextData y me dio resultados de rastreo que quería lograr.

Aquí hay un buen ejemplo de la documentación: LIKE (Transact-SQL): uso de caracteres comodín como literales

ssurba
fuente
4

Según la documentación :

Puede usar los caracteres coincidentes del patrón comodín como caracteres literales. Para utilizar un carácter comodín como carácter literal, encierre el carácter comodín entre paréntesis.

Necesitas escapar de estos tres personajes %_[:

'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
fuente
1

En lugar de '\' u otro carácter en el teclado, también puede usar caracteres especiales que no están en el teclado. Dependiendo de su caso de uso, esto podría ser necesario, si no desea que la entrada del usuario se use accidentalmente como un carácter de escape.

Rob Breidecker
fuente
2
A menudo uso ¬- sigue siendo un personaje de teclado en el Reino Unido, pero rara vez se usa a sabiendas :) (arriba a la izquierda entre Escy Tab)
Andi Mohr
Los usuarios aún pueden enviar datos que contienen letras que no están en el teclado. Esta respuesta suena sospechosamente como una sugerencia para evitar realmente resolver el problema ...
binki
0

Utilice siguiente.

Para que la entrada del usuario busque como está, use escape, ya que requerirá el siguiente reemplazo para todos los caracteres especiales (a continuación, se incluye todo el SQL Server).

Aquí la comilla simple "'" no se toma, ya que no afecta como una cláusula, ya que es una cuestión de concatenación de cadenas.

"-" & "^" & "]" reemplazar no es necesario ya que estamos escapando "[".

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

Luego, en SQL Query debería ser como sigue. (En la consulta parametrizada, la cadena se puede agregar con patrones después del reemplazo anterior).

Para buscar la cadena exacta.

like 'FormattedString' ESCAPE 'ð'

Para buscar comience con una cadena

like '%FormattedString' ESCAPE 'ð'

Para buscar final con cadena

like 'FormattedString%' ESCAPE 'ð'

Para buscar contener con cadena

like '%FormattedString%' ESCAPE 'ð'

y así sucesivamente para otra coincidencia de patrones. Pero la entrada directa del usuario debe formatearse como se mencionó anteriormente.

Creador anónimo
fuente
0

Hay un problema en eso mientras:

LIKE 'WC[[]R]S123456' 

y:

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

Ambos funcionan para SQL Server pero ninguno para Oracle.

Parece que no hay una forma ISO / IEC 9075 de reconocer un patrón que involucra una llave izquierda.

questaware
fuente