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. .
É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');
_
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.
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)
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
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