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

问题描述 投票:0回答:6

我使用

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 演示

sql sql-server
6个回答
288
投票

像这样修改您的

WHERE
条件:

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

这是Oracle支持转义字符的方式之一。在这里,您使用

escape
关键字定义转义字符。有关详细信息,请参阅Oracle 文档上的此链接

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

_
字符会查找(任何)单个字符的存在。如果您按
columnName LIKE '_abc'
搜索,它将为您提供包含
'aabc'
'xabc'
'1abc'
'#abc'
,但不包含
'abc'
'abcc'
'xabcd'
等行的结果。

'%'
字符用于匹配0个或多个字符。这意味着,如果您按
columnName LIKE '%abc'
搜索,它会给您的结果有
'abc'
'aabc'
'xyzabc'
等,但没有
'xyzabcd'
'xabcdd'
和任何其他不结尾的字符串与
'abc'

在您的情况下,您已通过

'%_%'
进行搜索。这将为该列的所有行提供一个或多个字符(即任何字符)作为其值。这就是为什么即使列值中没有
_
,您仍会获取所有行。


125
投票

下划线是 LIKE

 查询中针对任意字符的  通配符。

因此

LIKE %_%
的意思是“给我此列中至少包含一个任意字符的所有记录”。

您必须在 sql-server 中使用

[]
来转义通配符:

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

请参阅:LIKE (Transact-SQL)

演示


12
投票

当您想专门搜索通配符时,您需要转义它

这是通过将

ESCAPE
子句添加到
LIKE
表达式中来完成的。使用
ESCAPE
子句指定的字符将使后面的通配符“无效”。

您可以使用任何您喜欢的字符(但不能是通配符)。大多数人使用

\
因为这是许多编程语言也使用的

因此您的查询将导致:

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 个额外字符


2
投票

如果人们正在搜索如何在 BigQuery 中执行此操作:

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

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

WHERE mycolumn LIKE '%\\_%'

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


0
投票

您可以编写如下查询:

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

它会解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.