MySQL 列转行用法实现
需求需要将如下所示原始表数据转为结构化的数据按行显示:转为结构化数据:解决方法如果是单条记录通过SUBSTRING_INDEX容易实现,SQL语句如下:select name,SUBSTRING_INDEX(accounts,',',1) account from personAccounts where id=1UNIONselect name,SUBSTRING_INDEX(...
·
需求
需要将如下所示原始表数据转为结构化的数据按行显示:
转为结构化数据:
解决方法
如果是单条记录通过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;
结果如下:
更多推荐
已为社区贡献6条内容
所有评论(0)