SQL查询中%%%的含义是什么?

5

我熟悉这种查询:

select * from tableA where foo like '%bar%'

但今天我在一些遗留代码中遇到了三个相邻的百分号,就像这样:

select * from tableA where foo like '%%%'

这个查询似乎在mssql和oracle上都能够正常工作,当foo是字符串类型(varchar等)时也可以正常工作,但是当foo是数字类型时会失败。

有什么想法吗?

编辑:对不起,在原问题中打错了一个字,查询使用的是LIKE运算符。


6
它是否只是搜索字符串“%%%”?或者我漏掉了什么?这不是“like”。 - Kobi
1
你是不是想说 "where foo like '%%%'" 而不是 "where foo='%%%'"? - Eric Petroelje
就像Kobi所说的,你的第一个查询是在使用=而不是LIKE运算符,它是在查找包含'%bar%'的值。 - Wim
6个回答

7
原来在mysql中它会匹配所有内容:
mysql> create database foo;
Query OK, 1 row affected (0.06 sec)

mysql> use foo;
Database changed

mysql> create table foo ( bar char(20) );
Query OK, 0 rows affected (0.06 sec)

mysql> desc foo;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| bar   | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into foo values ('endwith%');
Query OK, 1 row affected (0.05 sec)

mysql> insert into foo values ('%startwith');
Query OK, 1 row affected (0.00 sec)

mysql> insert into foo values ('cont%ins');
Query OK, 1 row affected (0.00 sec)

mysql> insert into foo values ('doesnotcontain');
Query OK, 1 row affected (0.00 sec)

mysql> select * from foo where bar like '%%%';
+----------------+
| bar            |
+----------------+
| endwith%       |
| %startwith     |
| cont%ins       |
| doesnotcontain |
+----------------+
4 rows in set (0.00 sec)

5
如果您正在查找任何带有百分比的值,则需要使用ESCAPE:
例如:
SELECT * 
FROM SomeTable
WHERE foo LIKE '%|%%' ESCAPE '|'

如果foo是数值型(数据类型),那么如果你试图将列中的数字值与字符串比较,就会出现错误。

请现在阅读我的回答和我的评论,以便理解我为什么说了什么。此外,“ESCAPE”子句是否适用于SQL Server和Oracle? - shahkalpesh
@shahkalpesh - 是的,SQL Server支持此功能。 - AdaTheDev
1
谢谢。我不知道 SQL Server 中的 ESCAPE 子句。 - shahkalpesh

1
select * from tableA where foo='%%%'

等同于

select * from tableA where foo='%'

这是与之相同的想法。

ls *

或者

ls **

这意味着它将匹配任何内容。 例如: 对于MySQL,"%"匹配所有内容, 而对于ls,"*"匹配所有内容。
如果您添加两个%,它相当于一个。
mysql> create table foo ( bar char(20) );
Query OK, 0 rows affected (0.06 sec)

mysql> desc foo;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| bar   | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into foo values ('endwith%');
Query OK, 1 row affected (0.05 sec)

mysql> insert into foo values ('%startwith');
Query OK, 1 row affected (0.00 sec)

mysql> insert into foo values ('cont%ins');
Query OK, 1 row affected (0.00 sec)

mysql> insert into foo values ('doesnotcontain');
Query OK, 1 row affected (0.00 sec)

mysql> select * from foo where bar like '%%%';
+----------------+
| bar            |
+----------------+
| endwith%       |
| %startwith     |
| cont%ins       |
| doesnotcontain |
+----------------+
4 rows in set (0.00 sec)

那个回答很有用,如果人们知道 ls *ls ** 是什么意思的话;-) 最好还是明确地说明它的作用。 - Joachim Sauer

0
在SQL中,'%'和'_'(下划线符号)是通配符。
'%'代替任意数量的字符 - 相当于Linux / Unix和Windows文件搜索中的'*'
'_'代替一个字符 - 相当于Linux / Unix和Windows文件搜索中的'?'
正如其他人所提到的,一个'%'等同于任意数量的连续'%',因此在查询中,您可以将'%%%'替换为'%'

-2

在编程中,我们使用引号来表示字符串,并使用像 like 这样的运算符进行比较:

select * from emp where ename like 'KING';

对于数值比较,我们不需要将值放在引号中,而是使用逻辑运算符如 =:

select * from emp where deptno = 20;

-2

您是否希望它能与数字类型一起使用,尤其是当您传入一个字符串来与字段进行比较时?

此外,foo字段存储了什么内容?

通常,在进行通配符比较时会使用LIKE子句。但是,从您的示例中看来,数据库将该字段存储为通配符条件。而且, %%% 似乎表示 - 任何仅包含 %%% 作为其值的内容(尤其是当您使用=号进行比较时)。

编辑2:如果我猜对了,LIKE '%%%' 可能意味着任何具有%字符的内容。


1
%%%并不意味着包含一个%字符。如果要搜索包含百分号的任何值,您需要对其进行转义,例如WHERE foo LIKE '%|%%' ESCAPE '|'。 - AdaTheDev
@AdaTheDev:我已经更正了我的答案。起初,OP没有提到LIKE子句。 - shahkalpesh
不,你用Edit2又把它搞错了!LIKE '%%%'并不意味着任何带有%字符的内容...它只会返回所有记录,无论它们是否包含%符号...这就是我最初的观点! - AdaTheDev
@AdaTheDev:一开始我也是这么想的。不过,我不想怀疑原始查询编写者为何要写这样一个子句(如果它没有意义的话)。查询编写者可以代替 SELECT * FROM myTable WHERE foo like '%%%' 使用SELECT * FROM myTable 这种写法。 - shahkalpesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接