为什么在LIKE过滤器中使用Underscore字符会给我所有结果?

IMM*_*TAL 102 sql sql-server

我用以下LIKE条件编写了以下SQL查询:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'
Run Code Online (Sandbox Code Playgroud)

LIKE我想要搜索任何下划线%_%,但我知道我的列的数据没有下划线字符.

  • 为什么查询会给我表中的所有记录?

样本数据:

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');
Run Code Online (Sandbox Code Playgroud)

Sql-Fiddle

Rac*_*cha 168

WHERE像这样修改你的条件:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)

这是Oracle支持转义字符的方法之一.在这里,您可以使用escape关键字定义转义字符.有关详细信息,请参阅Oracle Docs上的此链接.

这是'_'和SQL '%'中的LIKE操作语句中的通配符.

_字符查找(任何)一个单个字符的存在.如果你搜索的columnName LIKE '_abc',它会给你有行的结果'aabc','xabc','1abc','#abc'但不是'abc','abcc','xabcd'等等.

'%'字符用于匹配0个或更多个字符.这意味着,如果你搜索的columnName LIKE '%abc',它会给你有导致'abc','aabc','xyzabc'等等,但是没有'xyzabcd','xabcdd'和其他任何字符串,不是结束'abc'.

在你的情况下,你搜索过'%_%'.这将为该列提供具有一个或多个字符的所有行,这意味着任何字符作为其值.这就是为什么即使_列值中没有行也要获取所有行.

  • 这里没有说明的是,这也适用于 SQL Server - 当他们自己标记 SQL Server 的问题时,这最初让我很想知道为什么 OP 接受了 Oracle SQL 的答案。至少应该编写答案以主要针对最初标记的 DBMS。 (4认同)

Tim*_*ter 78

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

因此LIKE %_%意味着"在本栏中给我所有记录至少有一个任意字符".

您必须在sql-server中使用[]around 转义通配符:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'
Run Code Online (Sandbox Code Playgroud)

请参阅:LIKE(Transact-SQL)

Demo

  • 这是正确的答案,因为用户在他们的问题中指定了`sql-server`标签,并且他们提供的SQLFiddle也被指定为MS SQL Server 2008. (4认同)

a_h*_*ame 8

由于你想专门搜索通配符,你需要逃避它

这是通过ESCAPELIKE表达式中添加子句来完成的.使用该ESCAPE子句指定的字符将使以下通配符"无效".

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

所以你的查询会导致:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';
Run Code Online (Sandbox Code Playgroud)

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

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';
Run Code Online (Sandbox Code Playgroud)

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


Fra*_*nck 5

下划线是某些内容的通配符。例如,“ A_%”将查找所有以“ A”开头的匹配项,之后至少要有1个额外的字符