我有一个包含以下数据的 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 |
有人知道该怎么做吗?
我尝试使用不同的联合将多值数据拆分为多行,但无法生成正确的结果。
JSON_TABLE()
函数将 Colour 和 Shape 列中的数据分成多行。
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;
我假设你有颜色和形状的“字典”。在本例中,您需要将数据与逗号分隔的列表连接起来。
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 中的空格。这可能会使查询更加冗长。我只留下表达本质的东西。对不起。