【发布时间】:2018-09-03 08:50:31
【问题描述】:
在将多个值从多列拆分到另一列时,我需要帮助。下面是一个例子
CREATE TABLE split
(
`Col_1` VARCHAR(120),
`Col_2` VARCHAR(50),
`Col_3` VARCHAR(20),
`Col_4` VARCHAR(50)
);
Insert into split (Col_1,Col_2,Col_3,Col_4) values ('ABC','1','10',null);
Insert into split (Col_1,Col_2,Col_3,Col_4) values ('DEF','2,3','30,40',null);
Insert into split (Col_1,Col_2,Col_3,Col_4) values ('GHI','4,5','50','500,600,700');
select * from split;
+-------+-------+-------+-------------+
| Col_1 | Col_2 | Col_3 | Col_4 |
+-------+-------+-------+-------------+
| ABC | 1 | 10 | NULL |
| DEF | 2,3 | 30,40 | NULL |
| GHI | 4,5 | 50 | 500,600,700 |
+-------+-------+-------+-------------+
我不是这方面的专家,但一直在玩,并设法将 col_2 拆分为多行,如下所示:
SELECT
Col_1,Col_2,Col_3,Col_4,
SUBSTRING_INDEX(SUBSTRING_INDEX(split.Col_2, ',', numbers.n), ',', -1) Col_2_NEW,
SUBSTRING_INDEX(SUBSTRING_INDEX(split.Col_3, ',', numbers.n), ',', -1) Col_3_NEW,
SUBSTRING_INDEX(SUBSTRING_INDEX(split.Col_4, ',', numbers.n), ',', -1) Col_4_NEW
FROM
(SELECT 1 n UNION ALL SELECT 2
UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN split
ON CHAR_LENGTH(split.Col_2) - CHAR_LENGTH(REPLACE(split.Col_2, ',', ''))>=numbers.n-1
ORDER BY Col_2, n;
+-------+-------+-------+-------------+-----------+-----------+-----------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_2_NEW | Col_3_NEW | Col_4_NEW |
+-------+-------+-------+-------------+-----------+-----------+-----------+
| ABC | 1 | 10 | NULL | 1 | 10 | NULL |
| DEF | 2,3 | 30,40 | NULL | 2 | 30 | NULL |
| DEF | 2,3 | 30,40 | NULL | 3 | 40 | NULL |
| GHI | 4,5 | 50 | 500,600,700 | 4 | 50 | 500 |
| GHI | 4,5 | 50 | 500,600,700 | 5 | 50 | 600 |
+-------+-------+-------+-------------+-----------+-----------+-----------+
但是,我也想将 col_3 和 col_4 拆分为新的,所以它给了我下面的输出。
+-------+-------+-------+-------------+-----------+-----------+-----------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_2_NEW | Col_3_NEW | Col_4_NEW |
+-------+-------+-------+-------------+-----------+-----------+-----------+
| ABC | 1 | 10 | NULL | 1 | 10 | NULL |
| DEF | 2,3 | 30,40 | NULL | 2 | 30 | NULL |
| DEF | 2,3 | 30,40 | NULL | 2 | 40 | NULL |
| DEF | 2,3 | 30,40 | NULL | 3 | 30 | NULL |
| DEF | 2,3 | 30,40 | NULL | 3 | 40 | NULL |
| GHI | 4,5 | 50 | 500,600,700 | 4 | 50 | 500 |
| GHI | 4,5 | 50 | 500,600,700 | 4 | 50 | 600 |
| GHI | 4,5 | 50 | 500,600,700 | 4 | 50 | 700 |
| GHI | 4,5 | 50 | 500,600,700 | 5 | 50 | 500 |
| GHI | 4,5 | 50 | 500,600,700 | 5 | 50 | 600 |
| GHI | 4,5 | 50 | 500,600,700 | 5 | 50 | 700 |
+-------+-------+-------+-------------+-----------+-----------+-----------+
到目前为止,我已经进行了全面搜索,他们只将行拆分为一列,并且无法找到与我类似的问题。 也许缺少一些连接或一些联合,我不知道,因为我不擅长查询。 有人能帮我一下吗?不要求我阅读指南或手册:-)
提前致谢
【问题讨论】:
-
谁能帮帮我?
标签: mysql