需求

需要将如下所示原始表数据转为结构化的数据按行显示:
在这里插入图片描述
转为结构化数据:
在这里插入图片描述

解决方法

如果是单条记录通过SUBSTRING_INDEX容易实现,SQL语句如下:

select name,SUBSTRING_INDEX(accounts,',',1) account from personAccounts where id=1
UNION
select name,SUBSTRING_INDEX(SUBSTRING_INDEX(accounts,',',2),',',-1) account from personAccounts where id=1
UNION
select name,SUBSTRING_INDEX(SUBSTRING_INDEX(accounts,',',3),',',-1) account from personAccounts where id=1

查询结果如下:
在这里插入图片描述
对于数据很多的话需要借助中间表来实现:

CREATE TABLE digits (digit INT(1));
INSERT INTO digits
VALUES
    (0),
    (1),
    (2),
    (3),
    (4),
    (5),
    (6),
    (7),
    (8),
    (9);
-- 创建序列表
CREATE TABLE sequence (seq INT(3));
INSERT INTO sequence (
    SELECT
        D1.digit + D2.digit * 10
    FROM
        digits D1
    CROSS JOIN digits D2
);

查询列转为行的语句如下:

SELECT 
	NAME,
    SUBSTRING_INDEX(SUBSTRING_INDEX(accounts, ',', seq), ',' ,- 1 ) accounts,
    seq
FROM
    sequence
CROSS JOIN personAccounts
WHERE
    seq BETWEEN 1 AND (
    	SELECT 1 + LENGTH(accounts) - LENGTH(REPLACE(accounts, ',', ''))
    )
ORDER BY name, accounts;

结果如下:
在这里插入图片描述


参考:
Mysql group_concat的反向应用实现(Mysql列转行)

Logo

更多推荐