2009-01-13 17 views
157

Estoy tratando de filtrar elementos con un procedimiento almacenado usando me gusta. La columna es un varchar (15). Los elementos que intento filtrar tienen corchetes en el nombre.¿Cómo puedo evitar los corchetes en una cláusula LIKE?

Por ejemplo: WC[R]S123456.

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

He encontrado algo de información sobre el uso de la palabra clave ESCAPE con LIKE pero no entienden cómo usarlo para tratar los corchetes como una cadena regular.

+0

Su pregunta tiene al menos 5 '' votos para el [tag: como operador] etiqueta. ¿Podría solicitar amablemente que sugiera [tag: sql-like] como [sinónimo] (http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit

Respuesta

216
LIKE 'WC[[]R]S123456' 

o

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

debería funcionar.

+6

La palabra clave ESCAPE es necesaria si desea utilizar un carácter de escape personalizado (la barra invertida es de hecho personalizada). –

+3

@RyanKohn: http://meta.stackexchange.com/q/153241 –

+1

Gracias por la corrección, @Ryan. – Shog9

17

Esto es lo que realmente utilizadas:

like 'WC![R]S123456' ESCAPE '!' 
8

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

Here's a good article with some more examples

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

-- or 

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

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

WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character 
+1

Tuve que usar esta versión (especificando el carácter "escape" explícitamente) - las otras respuestas aquí no dieron los resultados correctos para mí. – MarcE

71

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

No necesita escapar del ] ya que tiene un significado especial solo cuando se combina con [.

Por lo tanto, escapar de [ es suficiente para resolver el problema. Puede escapar de [reemplazándolo por[[].

+5

Esto fue realmente útil y la mejor respuesta. –

+5

[[] es simplemente extraño! ¡Pero gracias! –

2

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.

+1

A menudo uso '¬'; todavía es un carácter de teclado en el Reino Unido, pero rara vez se usa a sabiendas :) (arriba a la izquierda entre' Esc' y 'Tab') –

1

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

Esto explica el significado de la cadena "raro" '[[]' - sólo abarca el '[' personaje con corchetes, escapando con eficacia.

Mi caso de uso era especificar el nombre de un procedimiento almacenado con guiones bajos en él como un criterio de filtro para el Analizador.Así que puse la cadena '% name [_] of [_] a [_] stored [_] procedure%' en un campo TextData LIKE y me dio los resultados de rastreo que quería lograr.

Aquí es un buen ejemplo de la documentación: LIKE (Transact-SQL) - Using Wildcard Characters As Literals

1

Según documentation:

Usted puede utilizar el patrón de comodín juego caracteres literales como caracteres. Para usar un carácter comodín como carácter literal, encierra el carácter comodín entre corchetes.

tiene que escapar 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 
Cuestiones relacionadas