187 votes

Pourquoi l'utilisation d'un caractère Underscore dans un filtre LIKE me donne-t-elle tous les résultats ?

J'ai écrit la requête SQL ci-dessous avec une condition LIKE:

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

Dans le LIKE, je veux rechercher des caractères de soulignement %_%, mais je sais que les données de mes colonnes n'ont pas de caractères de soulignement.

  • Pourquoi la requête me renvoie-t-elle tous les enregistrements de la table ?

Données d'exemple:

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');

Démonstration de SQL Fiddle

290voto

Rachcha Points 2925

Modifiez votre condition WHERE comme ceci :

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

C'est l'une des façons dont Oracle prend en charge les caractères d'échappement. Ici, vous définissez le caractère d'échappement avec le mot-clé escape. Pour plus de détails, consultez ce lien sur Oracle Docs.

Les caractères '_' et '%' sont des métacaractères dans une instruction de requête LIKE en SQL.

Le caractère _ recherche la présence d'un seul caractère (n'importe lequel). Si vous recherchez par columnName LIKE '_abc', cela vous donnera des résultats avec des lignes ayant 'aabc', 'xabc', '1abc', '#abc' mais PAS 'abc', 'abcc', 'xabcd' et ainsi de suite.

Le caractère '%' est utilisé pour faire correspondre 0 ou plusieurs caractères. Cela signifie que si vous recherchez par columnName LIKE '%abc', cela vous donnera des résultats avec 'abc', 'aabc', 'xyzabc' et ainsi de suite, mais pas 'xyzabcd', 'xabcdd' et tout autre chaîne qui ne se termine pas par 'abc'.

Dans votre cas, vous avez recherché par '%_%'. Cela donnera toutes les lignes avec cette colonne ayant un ou plusieurs caractères, c'est-à-dire n'importe quels caractères, comme valeur. C'est pourquoi vous obtenez toutes les lignes même s'il n'y a pas de _ dans les valeurs de votre colonne.

129voto

Tim Schmelter Points 163781

L'underscore est le caractère de remplacement dans une requête LIKE pour un caractère arbitraire.

Ainsi LIKE %_% signifie "donne-moi tous les enregistrements avec au moins un caractère arbitraire dans cette colonne".

Vous devez échapper le caractère de remplacement, dans SQL Server avec [] autour de:

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

Voir : LIKE (Transact-SQL)

Démonstration SQL Fiddle

12voto

Comme vous souhaitez effectuer une recherche spécifique pour un caractère générique, vous devez l'échapper

Cela se fait en ajoutant la clause ESCAPE à votre expression LIKE. Le caractère spécifié avec la clause ESCAPE va "invalider" le caractère générique suivant.

Vous pouvez utiliser n'importe quel caractère (sauf un caractère générique). La plupart des gens utilisent un \ car c'est ce que font aussi de nombreux langages de programmation.

Ainsi, votre requête se présenterait comme suit :

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

Mais vous pouvez tout aussi bien utiliser un autre caractère :

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

Voici un exemple SQLFiddle : http://sqlfiddle.com/#!6/63e88/4

5voto

Franck Points 2462

Souligné est un joker pour quelque chose. par exemple 'A_%' cherchera toutes les correspondances qui commencent par 'A' et ont au moins 1 caractère supplémentaire après cela

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X