亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySql字符串拆分如何實現split功能

發布時間:2022-05-21 17:02:14 來源:億速云 閱讀:2492 作者:iii 欄目:開發技術

這篇文章主要講解了“MySql字符串拆分如何實現split功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySql字符串拆分如何實現split功能”吧!

需求描述

數據庫中 num字段值為:

MySql字符串拆分如何實現split功能

實現的效果:需要將一行數據變成多行

實現的sql

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM mysql.help_topic 
WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

案例演示

CREATE TABLE `company` (
`id` int(20) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`shareholder` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `company` VALUES ('1', '阿里巴巴', '馬云');
INSERT INTO `company` VALUES ('2', '淘寶', '馬云,孫正義');

1、原始數據演示

MySql字符串拆分如何實現split功能

2、處理結果演示

MySql字符串拆分如何實現split功能

3、sql語句

SELECT a.id
    , a.NAME
    , substring_index(substring_index(a.shareholder, ',', b.help_topic_id + 1), ',', - 1) AS shareholder
FROM company a
INNER JOIN mysql.help_topic b
    ON b.help_topic_id < (length(a.shareholder) - length(REPLACE(a.shareholder, ',', '')) + 1)

涉及的知識點如下:

字符串拆分: SUBSTRING_INDEX(str, delim, count)

參數解說 &emsp; &emsp; &emsp; 解釋
str    &emsp; &emsp;  需要拆分的字符串
delim   &emsp; &emsp; &ensp; 分隔符,通過某字符進行拆分
count    &emsp; &ensp; &ensp; 當 count 為正數,取第 n 個分隔符之前的所有字符; 當 count 為負數,取倒數第 n 個分隔符之后的所有字符。

舉例

(1)獲取第2個以逗號為分隔符之前的所有字符。

SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',2);

MySql字符串拆分如何實現split功能

(2)獲取最后一個到倒數第2個以逗號分隔符之后的所有字符

SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',-2);

MySql字符串拆分如何實現split功能

所以,我們的核心代碼中的 -1 ,就是獲取以逗號為分隔符的最后一個值;也就是7788

MySql字符串拆分如何實現split功能

替換函數:replace( str, from_str, to_str)

參數名   &ensp; &ensp; 解釋
str      &ensp; 需要進行替換的字符串
from_str  &ensp;  需要被替換的字符串
to_str   &ensp;   需要替換的字符串

舉例

將分隔符逗號替換為空。

SELECT REPLACE('7654,7698,7782,7788',',','');

MySql字符串拆分如何實現split功能

獲取字符串長度:LENGTH( str )

參數名   解釋
str     需要計算長度的字符串

獲取 &lsquo;7654,7698,7782,7788&rsquo; 字符串的長度

SELECT LENGTH('7654,7698,7782,7788')

MySql字符串拆分如何實現split功能

實現的原理解析

【4.1】 實現sql

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM mysql.help_topic 
WHERE help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

此處利用 mysql 庫的 help_topic 表的 help_topic_id 來作為變量,因為 help_topic_id 是自增的,當然也可以用其他表的自增字段輔助。

help_topic 表:

MySql字符串拆分如何實現split功能

MySql字符串拆分如何實現split功能

注意,這個輔助表的ID最大長度只有658;如果過長的字符串,可能需要借助其他自增的輔助表(可以是現有表,也可以自己造一個 1,2,3,4 遞增的行即可)

MySql字符串拆分如何實現split功能

【4.2】正式的原理解析

原SQL

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM   mysql.help_topic 
WHERE  help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

Step1:首先獲取最后需被拆分成多少個字符串,利用 help_topic_id 來模擬遍歷 第n個字符串。

這一步核心就是獲取,有多少個分隔符,比如本文的案例,就是知道有多少個逗號

涉及的代碼片段:

help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

MySql字符串拆分如何實現split功能

因為 help_topic_id是從0開始的,所以會得出 help_topic_id 值為:0~3,共4行數據;

Step2:根據“,”逗號來拆分字符串,此處利用 SUBSTRING_INDEX(str, delim, count) 函數,最后把結果賦值給 num 字段。

涉及的代碼片段:

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num

第一步:

以”,”逗號為分隔符,根據 help_topic_id 的值來截取第n+1個分隔符之前所有的字符串。 (此處 n+1 是因為help_topic_id 是從0開始算起,而此處需從第1個分隔符開始獲取。)

SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1)

eg: 
當 help_topic_id = 0時,獲取到的字符串 = 7654 
當 help_topic_id = 1時,獲取到的字符串 = 7654,7698 …(以此類推)

第二步:

以”,”逗號為分隔符,截取倒數第1個分隔符之后的所有字符串。

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1)

eg: 
根據第一步,當 help_topic_id = 0時,獲取到的字符串 = 7654,此時第二步截取的字符串 = 7654 
根據第一步,當 help_topic_id = 1時,獲取到的字符串 = 7654,7698,此時第二步截取的字符串 = 7698 
…(以此類推)

最終成功實現了以下效果 ~

MySql字符串拆分如何實現split功能

擴展:判斷外部值是否在 num列值中

5.1】find_in_set

如果匹配到了會得出1;如下圖

MySql字符串拆分如何實現split功能

實際業務中,我們只需要 where find_in_set(id,ids)>0

就可以判斷出;id列,是否在 ids列中出現過;做表連接的時候,也可以這樣;

5.2】instr

MySql字符串拆分如何實現split功能

我們可以看出,instr是找出 參數2=》也就是上圖中的 &lsquo;123&rsquo; 在參數1=》也就是上圖中的 &lsquo;321,123,555,12345&rsquo; 中最開始出現的位置;

所以我們也只需要 where find_in_set(ids,id)>0 ,就可以判斷出 id 在 ids中出現過;

但這有一個問題,如果逗號分隔開的字符串,包含我們查找的字符串,也會顯示出來,這就不符合我們 根據分隔符 , 判斷 查找字符串id 是否出現在 ids 中;

如下:

MySql字符串拆分如何實現split功能

我們本來想查以逗號為分隔的完全匹配,但是12345包含了 123 所以查出來的結果也是>0的,這不對;

所以我們為了避免這種情況,可以加上分隔符;然后再用 字符串+分隔符作為 查找的字符串 來 匹配;

MySql字符串拆分如何實現split功能

MySql字符串拆分如何實現split功能

我們被查找的字符串 ids 中 再加上一個正常的 123, 再查看,如下圖:確實是對的

MySql字符串拆分如何實現split功能

感謝各位的閱讀,以上就是“MySql字符串拆分如何實現split功能”的內容了,經過本文的學習后,相信大家對MySql字符串拆分如何實現split功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮滨县| 广南县| 土默特右旗| 石林| 绿春县| 蓝山县| 五大连池市| 崇义县| 栾城县| 兰考县| 西乌| 台山市| 漠河县| 南雄市| 凤山市| 石楼县| 项城市| 连城县| 视频| 呼伦贝尔市| 曲周县| 丹寨县| 卢龙县| 门头沟区| 富阳市| 鹰潭市| 义乌市| 鸡东县| 抚宁县| 通江县| 中牟县| 仙游县| 玉山县| 鄂托克前旗| 沙雅县| 田阳县| 连南| 罗山县| 肃北| 黑水县| 崇明县|