需求
需要將如下所示原始表數據轉爲結構化的數據按行顯示:
轉爲結構化數據:
解決方法
如果是單條記錄通過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;
結果如下: