SQL 将多值数据拆分为多行

问题描述 投票:0回答:2

我有一个包含以下数据的 SQL 表:

| Name     | Colour             | Shape            | 
| -------- | ------------------ | ---------------- |
| Bob      | Blue, Green        | Circle, Square   |
| Phil     | Yellow             |                  |
| Steve    | Green, Orange, Red | Square, Triangle |

我想创建一个视图/表,如下所示:

| Name     | Colour | Shape    | 
| -------- | -------| ---------|
| Bob      | Blue   | Circle   |
| Bob      | Blue   | Square   |
| Bob      | Green  | Circle   |
| Bob      | Green  | Square   |
| Phil     | Yellow |          |
| Steve    | Green  | Square   |
| Steve    | Green  | Triangle |
| Steve    | Orange | Square   |
| Steve    | Orange | Triangle |
| Steve    | Red    | Square   |
| Steve    | Red    | Triangle |

有人知道该怎么做吗?

我尝试使用不同的联合将多值数据拆分为多行,但无法生成正确的结果。

sql mysql database
2个回答
0
投票

您需要将逗号分隔的值转换为 JSON 格式,然后使用

JSON_TABLE()
函数将 ColourShape 列中的数据分成多行。

select t.Name, c.Colour, s.Shape
from mytable t
join json_table(
  replace(json_array(t.Colour), ',', '","'),
  '$[*]' columns (Colour varchar(50) path '$')
) c
join json_table(
  replace(json_array(t.Shape), ',', '","'),
  '$[*]' columns (Shape varchar(50) path '$')
) s;

演示在这里


0
投票

我假设你有颜色和形状的“字典”。在本例中,您需要将数据与逗号分隔的列表连接起来。

SELECT DISTINCT r.name, c.colour, s.shape
FROM rawdata AS r
LEFT JOIN colours AS c ON FIND_IN_SET(c.colour, r.colour)
LEFT JOIN shapes AS s ON FIND_IN_SET(s.shape, r.shape)
ORDER BY r.name ASC, c.colour ASC, s.shape ASC

演示在这里

P.S. 我不关心 CSV 中的空格。这可能会使查询更加冗长。我只留下表达本质的东西。对不起。

© www.soinside.com 2019 - 2024. All rights reserved.