mysql根據分隔符將一行數據拆分成多行數據

mysql根據分隔符將一行數據拆分成多行數據

關鍵函數

substring_index(str,delim,count)

str:要處理的字符串

delim:分隔符

count:計數

例子:str=f.s.z

​ substring_index(str,’.’,1)

​ 結果是:f

​ substring_index(str,’.’,2)

​ 結果是:f.s

​ 也就是說,如果count是正數,那麼就是從左往右數,第N個分隔符的左邊的全部內容

​ 相反,如果是負數,那麼就是從右邊開始數,第N個分隔符右邊的所有內容,如:

​ substring_index(str,’.’,-2)

​ 結果爲:s.z

​ 有人會問,如果我要中間的的s怎麼辦?

​ 很簡單的,兩個方向:

​ 從右數第二個分隔符的右邊全部,再從左數的第一個分隔符的左邊:

substring_index(substring_index(str,’.’,-2),’.’,1);

原始數據

在這裏插入圖片描述

處理結果展示

在這裏插入圖片描述

三種方式,相同的原理

  • 使用MySql庫中的自增序列表

SELECT
    a.id,
    a.email,
    substring_index(
        substring_index(
            a.name,
            ',',
            b.help_topic_id + 1
        ),
        ',' ,- 1
    ) AS splitName
FROM
    t_emp a
JOIN mysql.help_topic b ON b.help_topic_id < (
    length(a.name) - length(
        REPLACE (a.name, ',', '')
    ) + 1
)
  • 自建自增序列表

CREATE TABLE `auto_increment` (
`id` int(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `auto_increment` VALUES ('0'); 
INSERT INTO `auto_increment` VALUES ('1');
INSERT INTO `auto_increment` VALUES ('2');
INSERT INTO `auto_increment` VALUES ('3');
INSERT INTO `auto_increment` VALUES ('4');
SELECT
    a.id,
    a.email,
    substring_index(
        substring_index(
            a.name,
            ',',
            b.id+ 1
        ),
        ',' ,- 1
    ) AS splitName
FROM
    t_emp a
JOIN auto_increment b ON b.id < (
    length(a.name) - length(
        REPLACE (a.name, ',', '')
    ) + 1
)
  • 以數據庫裏已有的表,構建自增序列表

SELECT 
    a.id,
    a.email,
    substring_index(
        substring_index(
            a.name,
            ',',
            b.id+1
        ),
        ',',-1
    ) AS splitName
FROM
    t_emp a
join
(
    SELECT 
    (
        @ROW :=@Row + 1
    ) AS id 
    FROM 
    t_user,
    (
        SELECT @Row:=-1
    ) AS zz
) AS b ON b.id < (
    length(a.name) - length(
        replace(a.name,',','')
    ) + 1
)
ORDER BY a.id

t_user表是庫裏已有表(可以不是序列表),行數必須大於分割字段的最大逗號數

小結

  1. 序列表必須從0開始,行數與最多的逗號個數有關,行數至少比最長逗號個數加1,可以建0~1000。(其實也可以不從0開始,但是sql語句要做相對應的修改)

  2. 爲什麼不用MySQL自帶的自增序列表mysql.help_topic?因爲好多公司的數據庫是沒有權限操作這些表的, 不能使用。

  3. 序列表必須從0開始,行數與最多的逗號個數有關,行數至少比最長逗號個數加1,可以建0~1000。(其實也可以不從0開始,但是sql語句要做相對應的修改)

  4. 爲什麼不用MySQL自帶的自增序列表mysql.help_topic?因爲好多公司的數據庫是沒有權限操作這些表的, 不能使用。

參考博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章