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

118

Escribí la siguiente consulta SQL con una LIKEcondición:

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

En el LIKE, quiero buscar guiones bajos %_%, pero sé que los datos de mis columnas no tienen guiones bajos.

  • ¿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

INMORTAL
fuente
1
Es bueno agregar una consulta sql-fiddle, pero siempre debe mostrar la consulta en SO como texto sin formato. De lo contrario, esta pregunta es vulnerable a la pudrición del enlace .
Tim Schmelter
_ :: Un sustituto de un solo carácter
vhadalgi
Posible duplicado de SQL Server 2000/5 Escape de un subrayado
azulado

Respuestas:

193

Modifique su WHEREcondición de esta manera:

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

Esta es una de las formas en que Oracle admite caracteres de escape. Aquí define el carácter de escape con la escapepalabra clave. Para obtener más detalles, consulte este enlace en Oracle Docs .

Los '_'y '%'son comodines en una LIKEinstrucción operada en SQL.

El _personaje busca la presencia de (cualquiera) un solo personaje. Si busca por columnName LIKE '_abc', que le dará resultado con filas que tienen 'aabc', 'xabc', '1abc','#abc' pero NO 'abc', 'abcc', 'xabcd'y así sucesivamente.

El '%'carácter se utiliza para hacer coincidir 0 o más caracteres. Eso significa que, si se busca por columnName LIKE '%abc', que le dará resultado con tener 'abc', 'aabc', 'xyzabc'y así sucesivamente, pero no 'xyzabcd', 'xabcdd'y cualquier otra cadena que no termina con'abc' .

En su caso ha 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 obtiene todas las filas aunque no haya ningún valor _en sus columnas.

Rachcha
fuente
Me enfrento al mismo problema en el acceso a Db. puede decirme cómo puedo resolver este problema.
Tal vez pueda buscar en Google 'comodines en la base de datos de acceso'. Nunca trabajé en Access, así que no puedo ayudarte con eso. Incluso dudo que Access sea compatible con el likeoperador. Mi solución funcionará en la mayoría, si no en todas, las bases de datos.
Rachcha
2
Lo que no se indica aquí es que esto también funciona en SQL Server, lo que inicialmente me dejó perplejo por qué el OP aceptó una respuesta para Oracle SQL, cuando ellos mismos etiquetaron la pregunta para SQL Server. Al menos, la respuesta debe escribirse para apuntar principalmente al DBMS etiquetado originalmente.
underscore_d
87

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

Por LIKE %_%lo tanto, significa "dame 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)

Demo

Tim Schmelter
fuente
Gracias por proporcionar el enlace de MSDN en su respuesta. Me estaba costando encontrar información sobre el carácter especial de subrayado hasta que leí tu publicación.
Chris Smith
5
Esta es la respuesta correcta ya que el usuario especificó la sql-serveretiqueta en su pregunta y su SQLFiddle provisto también se designa como MS SQL Server 2008.
Govind Rai
8

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

Esto se hace agregando la ESCAPEcláusula a su LIKEexpresión. El carácter que se especifica con elESCAPE cláusula "invalidará" el siguiente carácter comodín.

Puede utilizar cualquier carácter que desee (pero no un carácter comodín). La mayoría de la gente usa un \porque eso es lo que también usan muchos lenguajes de programación

Entonces su consulta resultaría en:

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

Pero también puedes usar cualquier otro carácter:

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

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

un caballo sin nombre
fuente
5

El subrayado 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 adicional después de eso

Franck
fuente
0

Puede escribir la consulta de la siguiente manera:

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

resolverá tu problema.

Sonali Lad
fuente
¿Cómo agrega esto algo más allá de la respuesta aceptada?
Noah Broyles
0

En caso de que las personas estén buscando cómo hacerlo en BigQuery:

  • Un guión bajo "_" coincide con un solo carácter o byte.

  • Puede escapar "\", "_" o "%" usando dos barras invertidas. Por ejemplo, "\%". Si utiliza cadenas sin formato, solo se requiere una barra invertida. Por ejemplo, r "\%".

WHERE mycolumn LIKE '%\\_%'

Fuente: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

p1nox
fuente