为什么在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
子句添加到LIKE
expression式来完成的。 用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