为什么在象筛选器中使用下划线字符会给我所有的结果?

我使用 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

236943 次浏览

修改你的 WHERE条件如下:

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

这是 Oracle 支持转义字符的方式之一。这里用 escape关键字定义转义字符。详情请参阅 你可在此浏览甲骨文文件的连结

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

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

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

在您的情况下,您已经通过 '%_%'进行了搜索。这将给出该列具有一个或多个字符(即任何字符)的所有行作为其值。这就是为什么即使在列值中没有 _,也要获取所有行的原因。

下划线是某物的通配符。 比如说 ‘ A _%’将查找所有起始位置为‘ A’的匹配项,并在此之后至少有1个额外字符

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

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

你必须在 sql-server 中避开这个通配符,[]就在附近:

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

见: LIKE (Transact-SQL)

Demo

当你想特别寻找一个通配符的时候,你需要逃避这个问题

这是通过将 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

您可以按如下方式编写查询:

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

它会解决你的问题。

如果人们正在搜索如何在 BigQuery 中做到这一点:

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

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

WHERE mycolumn LIKE '%\\_%'

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