¿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


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

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.


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


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


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


0

Puede escribir la consulta de la siguiente manera:

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

resolverá tu problema.


¿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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.