mysql如何匹配數(shù)組字段中的某一個具體值
應(yīng)用背景
業(yè)務(wù)表中的某個字段存儲的值為數(shù)組,例如 1,2,3 。
現(xiàn)在需要查詢其中一個值是數(shù)組里面的對應(yīng)的一個值,該如何匹配。
就比如subject這個字段為一個數(shù)組,現(xiàn)在需要查詢subject包含1的學生。
使用模糊查詢的問題
因為subject里面存的不是具體的一個值,所以使用=顯然是不行的,這個時候大家首先會想到like的模糊查詢,我們一起來看看效果
SELECT * FROM `stu_c` WHERE subject LIKE '%1%'
執(zhí)行結(jié)果
可以看到將張三跟王五都查出來了,這顯然跟我們的需求不符,需求是只包含1的,應(yīng)該只查出來張三這條數(shù)據(jù)才對。
解決方案一
使用mysql中的FIND_IN_SET(str,fieldName)函數(shù),str是要查詢的字符串,fieldName是字段名,參數(shù)以“,”分隔,例如1,2,3
匹配單個(只包含1)sql語句如下
SELECT * FROM stu_c WHERE FIND_IN_SET('1', subject) > 0
匹配單個(只包含1)執(zhí)行結(jié)果
查出了subject包含1的學生信息
匹配多個(包含1跟3)sql語句如下
SELECT * FROM stu_c WHERE FIND_IN_SET('1', subject) > 0 OR FIND_IN_SET('3', subject) > 0;
匹配多個(包含1跟3)執(zhí)行結(jié)果
查出了subject包含1跟3的學生信息
解決方案二
使用REGEXP正則表達式匹配,REGEXP語法更加強大,功能更全,可以根據(jù)不同的需求選擇不同的用法,本文主要講查詢包含這個字符的數(shù)據(jù)
匹配單個(只包含1)sql語句如下
SELECT * FROM `stu_c` WHERE CONCAT ( ',', subject, ',' ) REGEXP ',(1),'
匹配單個(只包含1)執(zhí)行結(jié)果
查出了subject包含1的學生信息
匹配多個(包含1跟3)sql語句如下
SELECT * FROM `stu_c` WHERE CONCAT ( ',', subject, ',' ) REGEXP ',(1|3),'
匹配多個(包含1跟3)執(zhí)行結(jié)果
查出了subject包含1跟3的學生信息
總結(jié)
兩種方式都能解決匹配數(shù)組字段中某一個具體值的問題,但是也有差異,有各自的優(yōu)缺點,例如FIND_IN_SET(str,fieldName)函數(shù),如果前端頁面是多選項,也就是需要匹配滿足多個值的情況,就需要使用or拼接sql,但是REGEXP只需要把參數(shù)轉(zhuǎn)換為我們需要的格式(',(1|3),')即可。
如果項目需求只需匹配一個值,F(xiàn)IND_IN_SET函數(shù)直接在xml中使用就行,REGEXP仍需要將單個參數(shù)轉(zhuǎn)換為特定的格式(,(1),)。
綜上所述,單個值匹配建議用FIND_IN_SET函數(shù),多個值匹配建議用REGEXP正則表達式。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql?復制行數(shù)據(jù)命令經(jīng)驗分享(Mysql?復制一條數(shù)據(jù))
有時候表里有一行已經(jīng)添加好的數(shù)據(jù),想要多復制幾百條用來測試比如要分頁測試等,需要多條數(shù)據(jù),但是有時候數(shù)據(jù)表字段太多了,有幾十個,一個一個手寫那是不可能的2023-09-09mysql insert if not exists防止插入重復記錄的方法
在 MySQL 中,插入(insert)一條記錄很簡單,但是一些特殊應(yīng)用,在插入記錄前,需要檢查這條記錄是否已經(jīng)存在,只有當記錄不存在時才執(zhí)行插入操作,本文介紹的就是這個問題的解決方案。2011-04-04出現(xiàn)錯誤mysql Table ''performance_schema...解決辦法
這篇文章主要介紹了解決出現(xiàn)錯誤mysql Table 'performance_schema.session_variables' doesn't exist的相關(guān)資料,需要的朋友可以參考下2017-04-04本地windows安裝兩個mysql服務(wù)器,配置主從同步
大型網(wǎng)站為了緩解大量的并發(fā)訪問,除了在網(wǎng)站實現(xiàn)分布式負載均衡,還會搭建服務(wù)器mysql集群技術(shù),來分擔主數(shù)據(jù)庫的壓力。在本地電腦能實現(xiàn)這樣的技術(shù)嗎,本地windows安裝兩個mysql服務(wù)器,配置主從同步也是可以實現(xiàn)的,快來跟著教程測試一下吧。2022-12-12SQL實現(xiàn)LeetCode(184.系里最高薪水)
這篇文章主要介紹了SQL實現(xiàn)LeetCode(184.系里最高薪水),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08M1芯片安裝mysql8.0數(shù)據(jù)庫的實現(xiàn)步驟(圖文)
這篇文章主要介紹了M1芯片安裝mysql8.0數(shù)據(jù)庫的實現(xiàn)實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02