find_in_set 函數的語法:
FIND_IN_SET(str,strList)mysql
- str 要查詢的字符串
- strList 字段名,參數以「,」分隔,如(1,2,6,8)
- 查詢字段(strList)中包含的結果,返回結果null或記錄。
假如字符串str在由N個子鏈組成的字符串列表strlist 中,則返回值的範圍在 1 到 N 之間。 一個字符串列表就是一個由一些被 ‘,’ 符號分開的子鏈組成的字符串。若是第一個參數是一個常數字符串,而第二個是type SET列,則FIND_IN_SET() 函數被優化,使用比特計算。 若是str不在strlist 或strlist 爲空字符串,則返回值爲 0 。如任意一個參數爲NULL,則返回值爲 NULL。這個函數在第一個參數包含一個逗號(‘,’)時將沒法正常運行。sql
例子一 基礎用法
1 select find_in_set('1','1,2,3,4,5,6'); 2 select find_in_set('2','1,2,3,4,5,6'); 0 select find_in_set('7','1,2,3,4,5,6'); 0 select find_in_set('2','1,21,3,4,5,6'); 0 select find_in_set('1',''); null select find_in_set(null,'1,2,3,4,5,6'); null select find_in_set('1',null);
例子二 find_in_set()和in的區別
建立表,並添加數據數據庫
CREATE TABLE `tb_test` ( `id` int(8) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `list` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `tb_test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin'); INSERT INTO `tb_test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin'); INSERT INTO `tb_test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');
查詢一bash
SELECT * from tb_test where "daodao" in (list);
結果函數
捕獲.PNG優化
解析: 實際上這樣是不行的,這樣只有當list字段的值等於'daodao'時(和IN前面的字符串徹底匹配),查詢纔有效,不然都得不到結果,即便'daodao'真的在list中。url
SELECT * from tb_test where "daodao,xiaohu,xiaoqin" in (list);
執行上面這條語句,才能返回結果。spa
捕獲.PNG.net
查詢二code
SELECT * from tb_test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao')
結果
捕獲.PNG
解析: 這兩條到底有什麼區別呢?爲何第一條不能取得正確的結果,而第二條卻能取得結果。緣由實際上是(一)中 (list) list是變量, 而(二)中 ('libk', 'zyfon', 'daodao')是常量。
查詢三
SELECT * from tb_test where FIND_IN_SET("daodao",list)
結果
捕獲.PNG
解析: find_in_set 函數 這裏的「list」 是 變量
例子三 find_in_set()和like的區別
在mysql中,有時咱們在作數據庫查詢時,須要獲得某字段中包含某個值的記錄,可是它也不是用like能解決的,使用like可能查到咱們不想要的記錄,它比like更精準,這時候mysql的FIND_IN_SET函數就派上用場了
建立表,並插入數據
CREATE TABLE users( id int(6) NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, limits VARCHAR(50) NOT NULL, -- 權限 PRIMARY KEY (id) ); INSERT INTO users(name, limits) VALUES('小張','1,2,12'); INSERT INTO users(name, limits) VALUES('小王','11,22,32');
其中limits表示用戶所擁有的權限(以逗號分隔),如今想查詢擁有權限編號爲2的用戶,若是用like關鍵字的話,則查詢結果以下:
SELECT * FROM users WHERE limits LIKE '%2%';
捕獲.PNG
很顯然,結果不符合預期,下面用find_in_set 函數 來 解決。
SELECT * from users where FIND_IN_SET('2',limits)
捕獲.PNG
解析: mysql字符串函數 find_in_set(str1,str2)函數是返回str2中str1所在的位置索引,str2必須以","分割開。
總結:like是普遍的模糊匹配,字符串中沒有分隔符,Find_IN_SET 是精確匹配,字段值以英文」,」分隔,Find_IN_SET查詢的結果要小於like查詢的結果。
例子四
··· select t.id from ( select 1 as id, 'nick' as name union all select 2 as id, 'viki' as name union all select 3 as id, 'robin' as name union all select 4 as id, 'teng' as name union all select 5 as id, 'mike' as name union all select 6 as id, 'will' as name ) t where find_in_set(t.id, '2,3,4') > 0; ··· 結果
捕獲.PNG
參考文獻:https://blog.csdn.net/chenpeng19910926/article/details/51790034 [https://blog.csdn.net/c_base_jin/article/details/74358235](