首頁 > 軟體

Mysql中find_in_set()函數用法詳解以及使用場景

2023-03-11 06:02:20

一、find_in_set() 函數詳解

範例:

select FIND_IN_SET('1', '1,2,3');
// 結果:1
select FIND_IN_SET('3', '1,2,3');
// 結果:3
select FIND_IN_SET('4', '1,2,3');
// 結果:0
// 後一個包含前一個返回大於0的元素所在位置,不包含前一個則返回0

相信大家看完以上範例就知道這個函數的大概作用了,以下是MySQL手冊中官方說明

FIND_IN_SET(str,strlist),該函數的作用是查詢欄位(strlist)中是否包含(str)的結果,
返回結果為null或記錄 。

str 要查詢的字串
strlist 需查詢的欄位,引數以”,”分隔,例如如 '1,2,3'
假如字串str在由N個子鏈組成的字串列表strlist 中,則返回值的範圍在 1 到 N 之間。 一個字串列表
就是一個由一些被’,‘ 符號分開的子鏈組成的字串。如果第一個引數是一個常數位符串,而第二個是type SET列,
則FIND_IN_SET() 函數被優化,使用位元計算。 
如果str不在strlist 或strlist 為空字串,則返回值為 0 。
如任意一個引數為NULL,則返回值為 NULL。
這個函數在第一個引數包含一個逗號( , )時將無法正常執行。

概括一下就是(前一個字串是A,後一個字串是B):

如果B字串包含A字串:則返回大於0的值,這個值就是A字串在B字串的所在位置;

如果B字串不包含A字串:則返回0;

如果B字串或者A字串有任意一個是null,則返回null;

如果A字串包含逗號,則無法執行。

二、應用場景

就拿若依的許可權認證的其中一條sql來給大家舉例吧:

SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept 
WHERE dept_id = 101 or FIND_IN_SET(101, ancestors) ;

查詢結果:

sql想要實現的功能就是查詢部門id是101的,或者其他部門的ancestors欄位(祖先)中有101的所有部門。使用FIND_IN_SET()函數完全可以實現。

那有的朋友就會說了,為什麼不用in或者like呢,區別如下:

三、FIND_IN_SET()和IN、LIKE的區別:

1.IN和FIND_IN_SET的區別:

SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept 
WHERE '101' IN ('101,102') ;

in後面只能跟常數, 如果跟字串的話,就會和字串的值進行完全匹配,所以上面的sql查詢不到記錄。
但是find_in_set()函數可以使用常數或欄位。

2.like和FIND_IN_SET的區別:

SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept 
WHERE ancestors LIKE '%10%' ;

SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept 
WHERE FIND_IN_SET(10, ancestors)  ;

like是廣泛的模糊匹配,字串中沒有分隔符,Find_IN_SET 是精確匹配,欄位值會以英文”,”分隔,
Find_IN_SET查詢的結果要小於like查詢的結果。

總結

到此這篇關於Mysql中find_in_set()函數用法詳解以及使用場景的文章就介紹到這了,更多相關Mysql find_in_set()函數用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com