MySQL函數find_in_set介紹


MySQL函數find_in_set介紹

數據庫中的某個字段我十以字符存儲的,同時又以","隔開的。如果想要查詢這個字段中包含某個字符串該怎么查詢?使用like?感覺不妥,如果使用like匹配可能會出問題比如“15”、“152”你要查詢15只要包含15的都查詢出來了,這不是我想要的。如果使用in()查詢,不行不能夠查詢出需要匹配的值。百度了一下發現了find_in_set的方法。驚喜若狂,正是我需要的查詢方法有增加了一個技能。

場景介紹

人有時會身兼數職,需要查找出其中擔任某一職務的都有哪些人,如下面position字段,不同的職務用數字表示,多個職務以逗號隔開。

先要查找出擔任1職務的人員,通過以下兩種方式來查詢。

方式一

采用模糊查詢,匹配出1職務的記錄,如下SQL:

select * from user where position like '%1%'

查詢結果如下,仔細觀察你會發現position為10的也被查出來了,但這個不符合業務要求。

方式二

采用in的記錄,如下SQL【in查詢相當於多個or條件的疊加】:

select * from user where position in (1)

方式三

采用的MySQL的的原生函數FIND_IN_SET(STR,數組)來查詢,SQL如下:

select * from user where find_in_set(1,position)

查詢結果如下,符合要求。

函數介紹

FIND_IN_SET(STR,strlist),注意其中strlist只識別英文逗號。

https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_find-in-set

like是廣泛的模糊匹配,字符串中沒有分隔符
​ IN 后面是變量,且是模糊查詢
​ Find_IN_SET 是精確匹配,字段值必須以英文”,”分隔,Find_IN_SET查詢的結果要小於like查詢的結果

根據上面示例總結:

  1. FIND_IN_SET(arg1,arg2)中arg1代表我們要查找的字符串,arg2代表中我們要匹配的列名。

  2. FIND_IN_SET(arg1,arg2)中arg2中數據必須是要用 , 分割。

  3. FIND_IN_SET(arg1,arg2)中arg1是跟arg2中以,分割進行全匹配的。

注意在hibernate中如果要使用需要按如下寫【后面要加">0"】,不然會報錯

@Override
	public VideoType findVideoTypeRealId(String id) {
		List parameters = new ArrayList();
		String where = " find_in_set(?,REALID)>0";
		parameters.add(id);
		String sql = "";
		return (VideoType)super.getObjectUnique(VideoType.class, null, where, parameters.toArray());
	}

原文鏈接:https://blog.csdn.net/xueshao110/article/details/80606960

=====================================================================

博客地址:https://www.codepeople.cn

=====================================================================

微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM