Mysql中substring_index函數(shù)實現(xiàn)字符分割一行變多行
問題
有時候我們表里會存在某個字符(例如經(jīng)常用到的,)分割的分割的數(shù)據(jù),但是在使用的時候要將存在字符分割數(shù)據(jù)拆分,我們一般的做法先從數(shù)據(jù)庫中將數(shù)據(jù)查詢出,在內(nèi)存中通過字符串分割函數(shù)split進行處理,不會在sql中通過函數(shù)進行拆分,這也符合阿里的規(guī)范,但是如果我們是出報表,通過其他平臺寫sql的方式進行拆分展示,不經(jīng)過內(nèi)存字符串分割,這時候我們只能通過sql 函數(shù)substring_index來處理,下面介紹2種方式
解決方案
創(chuàng)建表
create table tb_staff_position_info
(
id varchar(255) not null comment '主鍵'
primary key,
created_at timestamp default CURRENT_TIMESTAMP not null comment '記錄創(chuàng)建時間',
updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '記錄修改時間',
staff_name varchar(64) default '' not null comment '員工名稱',
position_name varchar(64) default '' not null comment '多個職位以,號分割',
)
comment '員工職位表' charset = utf8;初始化數(shù)據(jù)
insert into tb_staff_position_info(staff_name,position_name)values
('小平','技術(shù)組長,產(chǎn)品經(jīng)理,項目經(jīng)理'),('小花','程序員,測試員,'),('小廣‘,'研發(fā)總監(jiān)')預期查詢
查詢員工所屬的職位,多個職位顯示多行
整體思路
1、將position_name 以","號進行拆分,使用mysql 的substring_index(clunm,拆分字符,第幾個n) 函數(shù),substring_index函數(shù)每次只能獲取一個職位
2、借助臨時表,從0開始自增,數(shù)據(jù)中最多有多少個分割字符,臨時表就有多少條數(shù)據(jù)
方案一
借助mysql 的自增表,如下
select
info.staff_name,
substring_index(
substring_index(
info.position_name ,
',',
b.n + 1
),
',' ,- 1
) AS position_name
from tb_staff_position_info info
join mysql.help_topic b
on b.help_topic_id < ( length(info.position_name ) - length(REPLACE (info.position_name , ',', '')) + 1 )
臨時表借助于mysql的help_topic 表中的 help_topic_id來實現(xiàn)
方案二
有時候查詢用戶的權(quán)限無法訪問mysql的表,那么我們也可以創(chuàng)建一個臨時表替換,如下所示
select
info.staff_name,
substring_index(
substring_index(
info.position_name ,
',',
b.n + 1
),
',' ,- 1
) AS position_name
from tb_staff_position_info info
join (
select 0 as n
union all
select 1 as n
union all
select 2 as n
) b
on b.n < ( length(info.position_name ) - length(REPLACE (info.position_name , ',', '')) + 1 )上述創(chuàng)建的臨時表b 最多能匹配 3個分割符,如果存在大于3個那么在將數(shù)據(jù)插入到臨時表即可
方案三
臨時表變成正式表,在數(shù)據(jù)庫中創(chuàng)建一張自增表
總結(jié)
上述方式各有千秋,下面總結(jié)優(yōu)缺點
優(yōu)缺點
方法一:
優(yōu)點:臨時表借助mysql 內(nèi)置的help_topic 表,無需自己創(chuàng)建臨時表
缺點:存在查詢賬號權(quán)限的限制,有的賬號是無法訪問mysql內(nèi)置表
方法二:
優(yōu)點:創(chuàng)建自增的臨時表不存在權(quán)限的限制
缺點:如果分割符存在多個,就要插入多條數(shù)據(jù),寫法上沒有方法一整潔優(yōu)雅
到此這篇關(guān)于Mysql中substring_index函數(shù)實現(xiàn)字符分割一行變多行的文章就介紹到這了,更多相關(guān)Mysql 字符分割內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL Community Server 8.0.11安裝配置方法圖文教程
這篇文章主要為大家詳細 介紹了MySQL Community Server 8.0.11安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
MySQL的match函數(shù)在sp中使用BUG解決分析
這篇文章主要為大家介紹了MySQL的match函數(shù)在sp中使用BUG解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
MySQL?8.0.29?安裝配置方法圖文教程(windows?zip版)
這篇文章主要為大家詳細介紹了windows?zip版MySQL?8.0.29?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

