web-dev-qa-db-fra.com

Pourquoi l'utilisation d'un caractère de soulignement 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 la LIKE je souhaite rechercher des traits de soulignement %_%, mais je sais que les données de mes colonnes ne comportent aucun caractère de soulignement. .

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

Échantillon de données:

_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

92
IMMORTAL

Modifiez votre condition WHERE comme ceci:

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

C'est l'une des manières 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, voir ce lien sur Oracle Docs .

Les '_' et '%' sont des caractères génériques dans une instruction LIKE en SQL.

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

Le caractère '%' sert à faire correspondre un nombre égal ou supérieur à 0 caractères. Cela signifie que si vous effectuez une recherche par columnName LIKE '%abc', vous obtiendrez un résultat avec 'abc', 'aabc', 'xyzabc' et ainsi de suite, mais pas 'xyzabcd', 'xabcdd' et toute autre chaîne qui ne se termine pas par 'abc'.

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

155
Rachcha

Le trait de soulignement est le caractère générique dans une requête LIKE pour un caractère arbitraire.

Par conséquent, LIKE %_% signifie "donnez-moi tous les enregistrements avec au moins un caractère arbitraire dans cette colonne".

Vous devez échapper le caractère générique, dans le serveur SQL avec [] around:

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

Voir: LIKE (Transact-SQL)

Demo

74
Tim Schmelter

Pour rechercher spécifiquement un caractère générique, vous devez vous échapper de ce caractère.

Ceci est fait en ajoutant la clause ESCAPE à votre expression LIKE. Le caractère spécifié avec la clause ESCAPE "invalidera" le caractère générique suivant.

Vous pouvez utiliser n’importe quel caractère (mais pas un caractère générique). La plupart des gens utilisent un \ parce que c'est ce que beaucoup de langages de programmation utilisent aussi

Donc, votre requête aurait pour résultat:

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

Mais vous pouvez tout aussi bien utiliser n'importe quel autre personnage:

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

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

6

Le trait de soulignement est un joker pour quelque chose. par exemple, 'A%' recherchera toutes les correspondances commençant par 'A' et comportera au minimum 1 caractère supplémentaire

4
Franck