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 ESCAPE
palabra clave LIKE
pero no entiendo cómo usarla para tratar los corchetes como una cadena normal.
LIKE '[fz]oo'
coincidirá con 'foo' y 'zoo'.LIKE 'WC\[R]S123456' ESCAPE '\'
ya que es más legible para mantenimiento.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[[]
.fuente
[[]
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 textoits[brac]et
significa: "Encuentra las siguientes cadenas consecutivas:,its
(aplica la regla para corchetes:)brac
,et
" . Por otro lado,its[[]brac]et
significa: "Encuentra las siguientes cadenas consecutivas:,its
(aplica la regla para corchetes:)[
,brac]et
" .Necesitaba excluir nombres que comenzaron con un guión bajo de una consulta, así que terminé con esto:
fuente
Esto es lo que realmente usé:
fuente
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.
fuente
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
fuente
Según la documentación :
Necesitas escapar de estos tres personajes
%_[
:fuente
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.
fuente
¬
- sigue siendo un personaje de teclado en el Reino Unido, pero rara vez se usa a sabiendas :) (arriba a la izquierda entreEsc
yTab
)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 "[".
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.
Para buscar comience con una cadena
Para buscar final con cadena
Para buscar contener con cadena
y así sucesivamente para otra coincidencia de patrones. Pero la entrada directa del usuario debe formatearse como se mencionó anteriormente.
fuente
Hay un problema en eso mientras:
y:
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.
fuente