首页 > 解决方案 > 在 SQL 中迭代逗号分隔值

问题描述

我正在寻找转换表格:

+-----+-------+-----+
| Foo |  Bar  | Baz |
+-----+-------+-----+
| a   | 1,2,3 |   A |
| a   |   1,2 |   B |
| b   | 1,5,6 |   A |
+-----+-------+-----+

至:

+--------+-----+
| BarBaz | Foo |
+--------+-----+
| 1A     | a,b |
| 2A     | a   |
| 3A     | a   |
| 1B     | a   |
| 2B     | a   |
| 5A     | b   |
| 6A     | b   |
+--------+-----+

标签: sqlsnowflake-cloud-data-platform

解决方案


,因此您可以像这样使用带有split_to_table的旧式连接:

with data(foo, bar, baz) as (
    select * from values
      ('a', '1,2,3', 'A'),
      ('a', '1,2', 'B'),
      ('b', '1,5,6', 'A')
)
select concat(s.value,baz) AS BarBaz
      , listagg(foo, ',') AS Foo
from data t, 
    lateral split_to_table(t.bar , ',') s
group by BarBaz
order by BarBaz;

给你:

BARBAZ  FOO
1A      a,b
1B      a
2A      a
2B      a
3A      a
5A      b
6A      b

cross join或通过添加table()连接部分的包装器来更改表​​单,如下所示:

from data t
cross join table(split_to_table(t.bar , ',')) s

或使用 FLATTEN 和SPLIT形式,如:

from data t
cross join table(flatten(split(t.bar , ','))) s

或旧的连接,和 LATERAL FLATTEN,如:

from data t,
LATERAL flatten(split(t.bar , ',')) s

推荐阅读