首页 > 解决方案 > 将列拆分为多列mysql

问题描述

我的数据框有一列(numbers_selected),对于每一行,它看起来像这样:

1. 6-9-27
2. 2-3-6-8-30
3. 3-11-13-18
4. 3-14-15-17-18-30
5. 3-8-10-12-16
6. 3-7-8-27-29
7. 8-14-21

如您所见,每一行可以有不同数量的数字。

我正在寻找的是看看是否可以为这些数字中的每一个创建一个列。最多有 6 列,因为一行中的数字不能超过 6 个。

最后,数据集应如下所示:

第一个号码 第二个号码 第三个数字 第四号 第 5 号 第六号
6 9 27 无效的 无效的 无效的
2 3 6 8 30 无效的
3 11 13 18 无效的 无效的
3 14 15 17 18 30
3 8 10 12 16 无效的
3 7 8 27 29 无效的
8 14 21 无效的 无效的 无效的

酒吧

我正在使用的查询是:

选择周,从 x 中选择 number_。

希望您能帮我解决这些问题,谢谢!

标签: mysqlsqlarraysjsoncsv

解决方案


json方法怎么样?

select week,
    js ->> '$[0]' as num1,
    js ->> '$[1]' as num2,
    js ->> '$[2]' as num3,
    js ->> '$[3]' as num4,
    js ->> '$[4]' as num5,
    js ->> '$[5]' as num6
from (
    select t.*, concat('[', replace(numbers_selected, '-', ','), ']') as js
    from mytable t
) t

这通过使用字符串函数将破折号分隔的字符串转换为看起来像 json 数组的东西来工作。通常,'6-9-27'变为[6,9,27]。然后我们可以使用 json 访问->>器通过索引来获取每个数组元素。

DB Fiddle 上的演示

周 | 数字1 | 数字2 | 数字3 | 数字4 | 数字5 | 数字6
---: | :--- | :--- | :--- | :--- | :--- | :---
   1 | 6 | 9 | 27 | | | 
   2 | 2 | 3 | 6 | 8 | 30 | 
   3 | 3 | 11 | 13 | 18 | | 无效的
   4 | 3 | 14 | 15 | 17 | 18 | 30  
   5 | 3 | 8 | 10 | 12 | 16 | 
   6 | 3 | 7 | 8 | 27 | 29 | 
   7 | 8 | 14 | 21 | | | 无效的

推荐阅读