<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料庫中 num欄位值為:
實現的效果:需要將一行資料變成多行
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、原始資料演示
2、處理結果演示
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)
涉及的知識點如下:
引數解說 解釋
str 需要拆分的字串
delim 分隔符,通過某字元進行拆分
count 當 count 為正數,取第 n 個分隔符之前的所有字元; 當 count 為負數,取倒數第 n 個分隔符之後的所有字元。
舉例
(1)獲取第2個以逗號為分隔符之前的所有字元。
SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',2);
(2)獲取最後一個到倒數第2個以逗號分隔符之後的所有字元
SELECT SUBSTRING_INDEX('7654,7698,7782,7788',',',-2);
所以,我們的核心程式碼中的 -1 ,就是獲取以逗號為分隔符的最後一個值;也就是7788
引數名 解釋
str 需要進行替換的字串
from_str 需要被替換的字串
to_str 需要替換的字串
舉例
將分隔符逗號替換為空。
SELECT REPLACE('7654,7698,7782,7788',',','');
引數名 解釋
str 需要計算長度的字串
獲取 ‘7654,7698,7782,7788’ 字串的長度
SELECT LENGTH('7654,7698,7782,7788')
【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 表:
注意,這個輔助表的ID最大長度只有658;如果過長的字串,可能需要藉助其他自增的輔助表(可以是現有表,也可以自己造一個 1,2,3,4 遞增的行即可)
【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
因為 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 …(以此類推)
最終成功實現了以下效果 ~
【5.1】find_in_set
如果匹配到了會得出1;如下圖
實際業務中,我們只需要 where find_in_set(id,ids)>0
就可以判斷出;id列,是否在 ids列中出現過;做表連線的時候,也可以這樣;
【5.2】instr
我們可以看出,instr是找出 引數2=》也就是上圖中的 ‘123’ 在引數1=》也就是上圖中的 ‘321,123,555,12345’ 中最開始出現的位置;
所以我們也只需要 where find_in_set(ids,id)>0 ,就可以判斷出 id 在 ids中出現過;
但這有一個問題,如果逗號分隔開的字串,包含我們查詢的字串,也會顯示出來,這就不符合我們 根據分隔符 , 判斷 查詢字串id 是否出現在 ids 中;
如下:
我們本來想查以逗號為分隔的完全匹配,但是12345包含了 123 所以查出來的結果也是>0的,這不對;
所以我們為了避免這種情況,可以加上分隔符;然後再用 字串+分隔符作為 查詢的字串 來 匹配;
我們被查詢的字串 ids 中 再加上一個正常的 123, 再檢視,如下圖:確實是對的
https://blog.csdn.net/pjymyself/article/details/81668157
https://www.cnblogs.com/gered/p/10797012.html
到此這篇關於MySql字串拆分實現split功能(欄位分割轉列)的文章就介紹到這了,更多相關MySql字串拆分內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45