MySQL 模糊查询
MySQL 模糊查询语句比较
LIKE语句
SELECT * FROM `table` where `field` like '%keyword%';
事实上,可以使用 locate()
和 instr()
这两个函数来代替
LOCATE语句
locate 语句 有两种方法重构,分别是 LOCATE(substr,str)
和 LOCATE(substr,str,pos)
用于返回子字符串 substr 在字符串 str 中第一次出现的位置
第三个参数 pos
表示从位置 pos 开始计算子串位置
如果 substr
不在 str
中,则返回 0
。如果任何参数为 NULL
,则返回 NULL
SELECT * from `table` where locate('keyword', `field`) > 0;
mysql> select LOCATE('bar', 'foobar111foobar222');
+-------------------------------------+
| LOCATE('bar', 'foobar111foobar222') |
+-------------------------------------+
| 4 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> select LOCATE('bar', 'foobar111foobar222', 5);
+----------------------------------------+
| LOCATE('bar', 'foobar111foobar222', 5) |
+----------------------------------------+
| 13 |
+----------------------------------------+
1 row in set (0.01 sec)
POSITION语句
position 和 locate 语义相似
SELECT * from `table` where position('keyword' IN `field`) > 0;
mysql> select POSITION('bar' IN 'foobar');
+-----------------------------+
| POSITION('bar' IN 'foobar') |
+-----------------------------+
| 4 |
+-----------------------------+
1 row in set (0.00 sec)
INSTR语句
SELECT * from `table` where instr(`field`, 'keyword') > 0;
mysql> select INSTR('foobar', 'BAR');
+------------------------+
| INSTR('foobar', 'BAR') |
+------------------------+
| 4 |
+------------------------+
1 row in set (0.00 sec)
instr()
是多字节安全的,并且仅当至少一个参数是 binary string
时才区分大小写。如果任一参数为 NULL,则此函数返回 NULL
locate
、position
和 instr
的差別只是参数的位置不同,同时 locate
多一个起始位置的参数外,两者是一样的。
find_in_set 语句
FIND_IN_SET(str,strlist)
如果字符串 str
在由 N 个子字符串组成的字符串列表 strlist
中,则返回 1 到 N 范围内的值。字符串列表是由 ,
字符分隔的子字符串组成的字符串。如果第一个参数是一个常量字符串,而第二个参数是一个 SET 类型的列,则 FIND_IN_SET() 函数被优化为使用位算术。如果 str
不在 strlist
中或 strlist
是空字符串,则返回 0。如果任一参数为 NULL
,则返回 NULL
。如果第一个参数包含逗号 ,
字符,此函数将无法正常工作
可以比较下图中的例子
mysql> select LOCATE(11, '23,45,67,89,112');
+-----------------------------------+
| LOCATE(11, '23,45,67,89,112') |
+-----------------------------------+
| 17 |
+-----------------------------------+
1 row in set (0.01 sec)
mysql> select FIND_IN_SET(11, '23,45,67,89,112');
+----------------------------------------+
| FIND_IN_SET(11, '23,45,67,89,112') |
+----------------------------------------+
| 0 |
+----------------------------------------+
1 row in set (0.01 sec)
mysql> select FIND_IN_SET(112, '23,45,67,89,112');
+-------------------------------------+
| FIND_IN_SET(112, '23,45,67,89,112') |
+-------------------------------------+
| 5 |
+-------------------------------------+
1 row in set (0.01 sec)
Additional
click String Functions and Operators for more information
Archives