我熟悉这种查询:
select * from tableA where foo like '%bar%'
但今天我在一些遗留代码中遇到了三个相邻的百分号,如下所示:
select * from tableA where foo like '%%%'
当foo是字符串类型(varchar等)时,这个查询似乎在mssql和oracle上都有效,但是当foo是数字时它会失败。
知道这意味着什么吗?
编辑:抱歉原始问题中的拼写错误,查询使用LIKE运算符。答案 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;