MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼
問題背景
查詢MySQL中用逗號(hào)分隔的字段【a,b,c】是否包含【a】
場(chǎng)景模擬
現(xiàn)有表【ec_logicplace】,如下圖所示:

要求判斷數(shù)值【1】是否存在于表【ec_logicplace】中的【actual_place_id】中
方法實(shí)現(xiàn)
首先將【actual_place_id】字段用逗號(hào)拆分查詢出來

通用模板為:
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( 'a,b,c', ',', help_topic_id + 1 ), ',',- 1 ) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH( 'a,b,c' ) - LENGTH( REPLACE ( 'a,b,c', ',', '' ) ) + 1
上述所用的關(guān)鍵字包含【SUBSTRING_INDEX】,【LENGTH】,【REPLACE】。
SUBSTRING_INDEX
用于字符串拆分,格式為:
SUBSTRING_INDEX(str,delim,count)
| 參數(shù) | 含義 |
| str | 需要拆分的字符串 |
| delim | 分隔符,通過某字符進(jìn)行拆分 |
| count | 當(dāng) count 為正數(shù),取第 n 個(gè)分隔符之前的所有字符; 當(dāng) count 為負(fù)數(shù),取倒數(shù)第 n 個(gè)分隔符之后的所有字符。 |
舉例:
獲取第二個(gè)以“,”逗號(hào)為分隔符之前的所有字符
SUBSTRING_INDEX('a,b,c',',',2)獲取倒數(shù)第二個(gè)以“,”逗號(hào)為分隔符之前的所有字符
SUBSTRING_INDEX('a,b,c',',',-2)LENGTH
獲取字符串的長(zhǎng)度,格式為:
LENGTH(str)
| 參數(shù) | 含義 |
| str | 需要計(jì)算長(zhǎng)度的字符串 |
舉例:
獲取’a,b,c‘字符串的長(zhǎng)度
LENGTH('a,b,c')REPLACE
替換函數(shù),格式為:
replace(str,from_str,to_str)
| 參數(shù) | 含義 |
| str | 需要進(jìn)行替換的字符串 |
| from_str | 需要被替換的字符串 |
| to_str | 需要替換的字符串 |
舉例:
將分隔符“,”逗號(hào)替換成“、”頓號(hào)
REPLACE('a,b,c',',','、')SQL解析
此處用的是MySQL庫(kù)的help_topic 表的help_topic_id 來作為變量,因?yàn)閔elp_topic_id 是自增的。
原理:把要拆分的字符串拆分,首先需要知道最后要被拆分成多少個(gè)字符串,也就是上述所說的count,其次是需要知道用什么來進(jìn)行拆分。所以分為兩個(gè)步驟來進(jìn)行sql編寫
step1:獲取最后需被拆分成多少個(gè)字符串,用help_topic_id 來模擬遍歷第n個(gè)字符串:
help_topic_id < LENGTH('a,b,c')-LENGTH(REPLACE('a,b,c',',',''))+1step2:根據(jù)逗號(hào)進(jìn)行拆分字符串,也就是SUBSTRING_INDEX函數(shù),最后把結(jié)果賦值給num字段
SUBSTRING_INDEX(SUBSTRING_INDEX('a,b,c',',',help_topic_id+1),',',-1) AS num需要注意的是,這里使用的是MySQL中的內(nèi)置表help_topic,里面有508條數(shù)據(jù)(不同版本數(shù)據(jù)條數(shù)有差別),用戶需要有對(duì)該表查詢的權(quán)限,這樣的話只滿足分割數(shù)量少于508條的字符串,否則應(yīng)該自定義輔助表,設(shè)置更大的一個(gè)遞增列
當(dāng)需要分割的字符串是查詢出來的時(shí)候
當(dāng)需要分割的字符串是查詢出來的時(shí)候,可能不止一條數(shù)據(jù),直接嵌入模板SQL會(huì)報(bào)錯(cuò)

這時(shí)候可以使用存儲(chǔ)過程來進(jìn)行處理,也就是本次遇到的問題
要求判斷數(shù)值【1】是否存在于表【ec_logicplace】中的【actual_place_id】中
首先創(chuàng)建一個(gè)存儲(chǔ)過程,一個(gè)輸入?yún)?shù)一個(gè)輸出參數(shù),輸入?yún)?shù)為需要判斷的值,輸出參數(shù)為判斷結(jié)果,我們以0,1來進(jìn)行判斷,0是輸入?yún)?shù)不存在于表字段中,1是輸入?yún)?shù)存在于表字段中。存儲(chǔ)過程如下
CREATE DEFINER=`root`@`%` PROCEDURE `queryActualInLogic`(IN `actualPlaceId` bigint,OUT `isContain` int)
BEGIN
DECLARE v_column VARCHAR(100);
-- 設(shè)置終止標(biāo)記
declare done int default 0;
# 查詢出所有待判斷的字段值集合
declare table_loop cursor for
SELECT actual_place_id FROM ec_logicplace WHERE actual_place_id IS NOT NULL;
# 捕獲系統(tǒng)拋出的 not found 錯(cuò)誤,如果捕獲到,將 done 設(shè)置為 1 相當(dāng)于try異常
declare continue handler for not found set done=1;
open table_loop;
out_loop:LOOP
# 遍歷字段值,一一賦值
FETCH NEXT FROM table_loop into v_column;
IF done = 1 THEN
LEAVE out_loop;
END IF;
# 遍歷字段值,拆分后進(jìn)行判斷,存在則賦值1,不存在則賦值0
SET @STMT = CONCAT("SELECT COALESCE(count(1),0) AS isContain into @v_count FROM
(SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( '",v_column,"' , ',', help_topic_id + 1 ), ',', -1 ) AS num
FROM mysql.help_topic WHERE
help_topic_id < LENGTH( '",v_column,"' ) - LENGTH ( REPLACE ( '",v_column,"' , ',', '' ) ) + 1
) t WHERE t.num = ",actualPlaceId,";");
PREPARE STMT FROM @STMT;
#執(zhí)行語(yǔ)句
EXECUTE STMT;
deallocate prepare STMT;
set isContain = @v_count;
if isContain = 1 THEN
LEAVE out_loop;
END IF;
END LOOP out_loop;
close table_loop;
END測(cè)試:


后續(xù)MyBatis調(diào)用存儲(chǔ)過程的返回值進(jìn)行業(yè)務(wù)判斷見
MyBatis調(diào)用MySQL存儲(chǔ)過程,有返回參數(shù)
到此這篇關(guān)于MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼的文章就介紹到這了,更多相關(guān)MySQL字符串分割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn)
本文主要介紹了k8s+springboot+CronJob定時(shí)任務(wù)部署實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
java反射實(shí)現(xiàn)javabean轉(zhuǎn)json實(shí)例代碼
基于java反射機(jī)制實(shí)現(xiàn)javabean轉(zhuǎn)json字符串實(shí)例,大家參考使用吧2013-12-12
SpringBoot集成MyBatisPlus+MySQL的實(shí)現(xiàn)
MybatisPlus是國(guó)產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫mapper.xml的重復(fù)勞動(dòng),本文主要介紹了SpringBoot集成MyBatisPlus+MySQL的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10
Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例
這篇文章主要介紹了Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11
Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過程淺析
昨天仔細(xì)研究了activeMQ消息隊(duì)列,也遇到了些坑,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合ActiveMQ的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
springboot?maven?打包插件介紹及注意事項(xiàng)說明
這篇文章主要介紹了springboot?maven?打包插件介紹及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行sql腳本的方法步驟
本文主要介紹了SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行sql腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

