1、函數簡介
FIND_IN_SET(str,strlist)
假如字符串str 在由N 子鏈組成的字符串列表strlist 中, 則返回值的范圍在 1 到N 之間 。一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則 FIND_IN_SET() 函數被優化,使用比特計算。如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
2、FIND_IN_SET 和 IN 的區別
網上現成的代碼,拿過來用一下:
CREATE TABLE `test` (
`id` int(8) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`list` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `test` VALUES (1, 'name', 'daodao,www.111cn.net,xiaoqin');
INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,www.111cn.net');
執行語句如下:
sql1: SELECT id, LIST, NAME FROM test WHERE 'daodao' IN (LIST);
sql2: SELECT id, LIST, NAME FROM test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao');
執行結果如下:
sql1 查詢結果為空
sql2能夠查詢出數據
為什麼sql1不能取得正確的結果,而sql2卻能取得結果?
是因為sql1中 IN (list), list 是變量,而sql2中 IN ('libk', 'zyfon', 'daodao'),('libk', 'zyfon', 'daodao')是常量。mysql中In是比較等不等,此處‘list’是表中的一個字段,也就是變量,除非它的值剛好和name的值一樣,否則返回的結果都為空。如果要讓sql1能查處正確的結果,需要用FIND_IN_SET()函數。mysql中FIND_IN_SET函數用來比較是不是包含,不管‘list’字段是變量或給定的字符串常量都能很好的工作。
sql3:SELECT id, LIST, NAME FROM `test` WHERE FIND_IN_SET('daodao',`list`);