MYSQL FIND_IN_SET函數

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);

結果函數

img

捕獲.PNG優化

解析: 實際上這樣是不行的,這樣只有當list字段的值等於'daodao'時(和IN前面的字符串徹底匹配),查詢纔有效,不然都得不到結果,即便'daodao'真的在list中。url

SELECT * from tb_test where "daodao,xiaohu,xiaoqin" in (list);

執行上面這條語句,才能返回結果。spa

img

捕獲.PNG.net

查詢二code

SELECT * from tb_test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao')

結果

img

捕獲.PNG

解析: 這兩條到底有什麼區別呢?爲何第一條不能取得正確的結果,而第二條卻能取得結果。緣由實際上是(一)中 (list) list是變量, 而(二)中 ('libk', 'zyfon', 'daodao')是常量

查詢三

SELECT * from tb_test where FIND_IN_SET("daodao",list)

結果

img

捕獲.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%';

img

捕獲.PNG

很顯然,結果不符合預期,下面用find_in_set 函數 來 解決。

SELECT * from users where FIND_IN_SET('2',limits)

img

捕獲.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; ··· 結果

img

捕獲.PNG

參考文獻:https://blog.csdn.net/chenpeng19910926/article/details/51790034 [https://blog.csdn.net/c_base_jin/article/details/74358235](


本文轉自https://www.jianshu.com/p/b2c1ba0ba34f

相關文章
相關標籤/搜索