在SQL查询中%%%的含义?

时间:2010-01-26 13:11:49

标签: sql

我熟悉这种查询:

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

但今天我在一些遗留代码中遇到了三个相邻的百分号,如下所示:

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

当foo是字符串类型(varchar等)时,这个查询似乎在mssql和oracle上都有效,但是当foo是数字时它会失败。

知道这意味着什么吗?

编辑:抱歉原始问题中的拼写错误,查询使用LIKE运算符。

6 个答案:

答案 0 :(得分:5)

在mysql中它与everthing匹配:

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)

答案 1 :(得分:4)

如果您尝试使用百分比找到任何值,则需要使用ESCAPE:

e.g。

SELECT * 
FROM SomeTable
WHERE foo LIKE '%|%%' ESCAPE '|'

如果foo是数字(在数据类型中),那么如果您尝试将列中的数值与字符串进行比较,则会出现错误。

答案 2 :(得分:1)

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

等同于

select * from tableA where foo='%'

的想法相同
ls *

ls **

这意味着它将匹配任何东西。 在示例中:  对于MySQL“%”匹配所有内容  并且对于ls“*”匹配所有内容

如果你加2%,它就相当于一个。

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)

答案 3 :(得分:0)

在SQL'%'和'_'(下划线符号)中是通配符 '%'替换任意数量的字符 - 相当于Linux / Unix和Windows文件搜索中的'*' '_'替换一个字符 - 相当于Linux / Unix和Windows文件搜索中的'?'

正如其他提到的,一个'%'相当于任意数量的连续'%',因此在您的查询中,您可以将'%%%'替换为'%'

答案 4 :(得分:-2)

你期望它能用于数字类型,尤其是当你传入一个字符串来比较字段?

此外,foo字段存储在其中的是什么?

通常在进行通配符比较时使用LIKE子句。但是,从您的示例看来,db有这个字段存储其中的通配符标准。而且,%%%似乎意味着 - 任何只包含%%%作为其值的东西(尤其是当你将它与=符号进行比较时)。

EDIT2:如果我猜对了,LIKE '%%%'可能意味着任何包含%字符的内容。

答案 5 :(得分:-2)

我们在引号中写字符串并使用类似的运算符来比较它们: select * from emp where ename like 'KING';

对于数值比较,我们不将值放在引号中并使用逻辑运算符,例如=: select * from emp where deptno = 20;