为什么在LIKEfilter中使用下划线字符给我所有的结果?

我用LIKE条件写下面的SQL查询:

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

LIKE我想search任何下划线%_% ,但是我知道我的列的数据没有下划线字符。

  • 为什么查询给我所有的表格logging?

样本数据:

 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的小提琴

像这样修改你的WHERE条件:

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

这是Oracle支持转义字符的方式之一。 这里用escape关键字定义转义字符。 有关详细信息,请参阅Oracle文档上的此链接 。

SQL中LIKE操作语句中的'_''%'是通配符。

_字符寻找(任何)单个字符的存在。 如果你用columnName LIKE '_abc' 'aabc'search,它会给你带有'aabc''xabc''1abc''#abc' 'abc'但不是'abc''abcc''xabcd'

'%'字符用于匹配0个或更多个字符。 这意味着,如果你通过columnName LIKE '%abc' ,它会给你带有'abc''aabc''xyzabc'等的结果,但是没有'xyzabcd''xabcdd'和任何其他string不以'abc'结尾。

在你的情况下,你已经search'%_%' 。 这将使该列的所有行都有一个或多个字符,即任何字符作为其值。 这就是为什么即使列值中没有_也能得到所有行。

下划线是LIKE查询中一个任意字符的通配符 。

因此LIKE %_%意思是“给我所有logging至less有一个任意字符在这个列”。

你必须转义通配符,在sql-server中用[]括起来:

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

请参阅: LIKE(Transact-SQL)

演示

下划线是一些通配符。 例如'A_%'将会寻找所有匹配的开始白色'A',并且在那之后至less有一个额外的字符

正如你想专门search一个通配符,你需要逃避

这是通过将ESCAPE子句添加到LIKEexpression式来完成的。 用ESCAPE子句指定的字符将使下面的通配符“无效”。

你可以使用你喜欢的任何字符(只是不是通配符)。 大多数人使用\因为这是许多编程语言也使用

所以你的查询会导致:

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

但是你也可以使用其他任何angular色:

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

这是一个SQLFiddle示例: http ://sqlfiddle.com/#!6/63e88/4