天天看點

MySQL的find_in_set()函數文法解釋find_in_set()和in的差別find_in_set()和like的差別

文法解釋

FIND_IN_SET(str,strlist)           

str是要查詢的字元串或者字段;

strlist可以是字段和字元清單,多個字元串之間必須以逗号分隔,例如:'1,2,e,t'。

這個函數的作用就是查詢strlist中是否包含str,傳回結果為null或記錄。假如字元串str在由N個子鍊組成的字元串清單strlist 中,則傳回值的範圍在 1 到 N 之間;如果str不在strlist 或strlist 為空字元串,則傳回值為 0。例如:

mysql> select find_in_set('s','2,3,s,f,NULL');
+---------------------------------+
| find_in_set('s','2,3,s,f,NULL') |
+---------------------------------+
|                               3 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set('vv','2,3,s,f,NULL');
+----------------------------------+
| find_in_set('vv','2,3,s,f,NULL') |
+----------------------------------+
|                                0 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set('vv',null);
+------------------------+
| find_in_set('vv',null) |
+------------------------+
|                   NULL |
+------------------------+           

find_in_set()和in的差別

比如有這樣的需求,想要取出findin表的list字段中含有vnhg字元串的資料行:

mysql> select * from findin;
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+
mysql> select * from findin where 'vnhg' in(list);
Empty set (0.00 sec)           

上面的SQL是無法實作這個需求,實際上隻有當list字段的值等于'vnhg'時(和in前面的字元串完全比對),查詢才能傳回結果。

使用下面的查詢就可以實作需求:

mysql> select * from findin where find_in_set('vnhg',list);
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+           

find_in_set()和like的差別

主要的差別就是like是廣泛的模糊查詢;而 find_in_set() 是精确比對,并且字段值之間用‘,'分開。

以實際的例子來體會:

mysql> select * from findin where find_in_set('vnh',list);
Empty set (0.00 sec)
mysql> select * from findin where list like '%vnh%';
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+