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


118

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

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

在中,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');

Sql-Fiddle


1
添加sql-fiddle查询很好,但是您应该始终在SO上以纯文本形式显示查询。否则这个问题很容易被链接腐烂
蒂姆·施密特

_ ::单个字符的替代者
vhadalgi

Answers:


193

WHERE像这样修改您的条件:

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

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

'_''%'处于通配符LIKE在SQL语句操作。

_角色寻找一个(任何)单个角色的存在。如果通过搜索columnName LIKE '_abc',它会给你有行的结果'aabc''xabc''1abc''#abc'但不是'abc''abcc''xabcd'等等。

'%'字符用于匹配0个或多个字符。这意味着,如果通过搜索columnName LIKE '%abc',它会给你造成具有'abc''aabc''xyzabc'等,但没有'xyzabcd''xabcdd'而不是结束任何其他字符串'abc'

您的搜索条件是'%_%'。这将使该列的所有行具有一个或多个字符(即任何字符)作为其值。这就是为什么即使_列值中没有列也获得所有行的原因。


我在访问Db时遇到同样的问题。能告诉我如何解决这个问题。

也许您可以在Google中获取“访问数据库中的通配符”。我从未在Access上工作,因此无法为您提供帮助。我什至怀疑Access是否支持like运算符。我的解决方案将在大多数(如果不是全部)数据库中运行。
Rachcha

2
这里没有说明的是,它也可以在SQL Server上使用-最初让我为OP为什么接受Oracle SQL的答案而烦恼,因为他们自己标记了SQL Server的问题。至少应将答案写为主要针对最初标记的DBMS。
underscore_d

86

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

因此,LIKE %_%意味着“给我该列中至少包含一个任意字符的所有记录”。

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

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

请参阅:LIKE(Transact-SQL)

Demo


感谢您在答案中提供MSDN链接。在阅读您的帖子之前,我很难找到有关下划线特殊字符的信息。
克里斯·史密斯

5
这是正确的答案为用户指定的sql-server标签在他们的问题和他们提供SQLFiddle也被指定为MS SQL Server 2008中
戈文德清莱

8

当您要专门搜索通配符时,需要对此进行转义

这是通过将ESCAPE子句添加到LIKE表达式中来完成的。ESCAPE子句指定的字符将使以下通配符“无效”。

您可以使用任何喜欢的字符(不能使用通配符)。大多数人使用a,\因为许多编程语言也使用a

因此,您的查询将导致:

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

但是您也可以使用其他任何字符:

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

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


5

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


0

您可以编写查询,如下所示:

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

它会解决您的问题。


除了可接受的答案之外,这又如何添加其他内容?
诺亚·布罗尔斯

0

如果人们正在BigQuery中搜索操作方法,请执行以下操作:

  • 下划线“ _”匹配单个字符或字节。

  • 您可以使用两个反斜杠来转义“ \”,“ _”或“%”。例如, ”\%”。如果您使用的是原始字符串,则只需要一个反斜杠。例如,r“ \%”。

WHERE mycolumn LIKE '%\\_%'

来源:https//cloud.google.com/bigquery/docs/reference/standard-sql/operators

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.