Pregunta ¿Por qué el uso de un carácter Subrayado en un filtro LIKE me da todos los resultados?


Escribí la siguiente consulta SQL con un LIKE condición:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

En el LIKE Quiero buscar cualquier guión bajo %_%, pero sé que los datos de mis columnas no tienen caracteres de subrayado.

  • ¿Por qué la consulta me da todos los registros de la tabla?

Data de muestra:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle


73
2017-10-25 11:22


origen


Respuestas:


Modificar su WHERE condición como esta:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Esta es una de las formas en que Oracle admite caracteres de escape. Aquí defines el carácter de escape con el escape palabra clave. Para detalles ver este enlace en Oracle Docs.

los '_' y '%' son comodines en una LIKE instrucción operada en SQL.

los _ el personaje busca la presencia de (cualquier) un solo personaje. Si buscas por columnName LIKE '_abc', le dará resultados con filas teniendo 'aabc', 'xabc', '1abc', '#abc' pero no 'abc', 'abcc', 'xabcd' y así.

los '%' el carácter se usa para hacer coincidir 0 o más números de caracteres. Eso significa, si buscas por columnName LIKE '%abc', te dará resultados con tener 'abc', 'aabc', 'xyzabc' y así sucesivamente, pero no 'xyzabcd', 'xabcdd' y cualquier otra cadena que no termine con 'abc'.

En tu caso has buscado por '%_%'. Esto dará todas las filas con esa columna que tiene uno o más caracteres, es decir, cualquier carácter, como su valor. Es por eso que está obteniendo todas las filas aunque no haya _ en los valores de tu columna


124
2017-10-25 11:27



El guión bajo es el comodín en una LIKE consulta para un carácter arbitrario.

Por lo tanto LIKE %_% significa "darme todos los registros con al menos un carácter arbitrario en esta columna".

Tienes que escapar del carácter comodín, en sql-server con [] alrededor:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

Ver: LIKE (Transact-SQL)

Manifestación


64
2017-10-25 11:36



Como desea buscar específicamente un carácter comodín, debe escapar de ese

Esto se hace agregando el ESCAPE cláusula a su LIKE expresión. El personaje que se especifica con el ESCAPE cláusula "invalidará" el siguiente carácter comodín.

Puedes usar cualquier personaje que te guste (simplemente no es un carácter comodín). La mayoría de las personas usa un \ porque eso es lo que muchos lenguajes de programación también usan

Entonces su consulta resultaría en:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Pero también puedes usar cualquier otro personaje:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

Aquí hay un ejemplo de SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5
2017-10-25 12:03



Underscore es un comodín para algo. por ejemplo 'A_%' buscará todas las coincidencias que comiencen con 'A' y tengan un mínimo de 1 carácter extra después de esa


3
2017-10-25 11:34