如何在AWS Redshift SQL中将空格/逗号分隔值拆分为多行?
Redshift SQL实现按空格/逗号拆分列值为多行
要实现将col2中以空格或逗号分隔的字符串拆分为单独行,同时保留col1和col3的对应值,你可以用以下两种方法:
方法一:递归CTE(灵活适配任意数量的元素)
这种方法不需要提前预估col2中最多有多少个元素,能自动处理所有拆分场景:
WITH recursive split_data AS ( -- 初始步骤:统一分隔符(空格换逗号),提取第一个元素和剩余字符串 SELECT col1, col3, split_part(replace(col2, ' ', ','), ',', 1) AS split_col2, substr(replace(col2, ' ', ','), length(split_part(replace(col2, ' ', ','), ',', 1)) + 2) AS remaining_str FROM your_table WHERE col2 IS NOT NULL AND col2 != '' UNION ALL -- 递归步骤:持续拆分剩余字符串,直到无内容可拆 SELECT col1, col3, split_part(remaining_str, ',', 1) AS split_col2, substr(remaining_str, length(split_part(remaining_str, ',', 1)) + 2) AS remaining_str FROM split_data WHERE remaining_str IS NOT NULL AND remaining_str != '' ) -- 最终结果:过滤空值,整理列名并排序 SELECT col1, split_col2 AS col2, col3 FROM split_data WHERE split_col2 IS NOT NULL AND split_col2 != '' ORDER BY col1, col2;
方法二:Generate Series + Split_Part(简洁高效,需预估最大元素数)
如果能确定col2中最多包含的元素数量(比如示例中最多5个),可以用这种更简洁的方式:
WITH nums AS ( -- 生成1到最大元素数的序列,这里设为10,可根据实际情况调整 SELECT generate_series(1, 10) AS n ) SELECT t.col1, split_part(replace(t.col2, ' ', ','), ',', n.n) AS col2, t.col3 FROM your_table t CROSS JOIN nums n -- 过滤掉空的拆分结果 WHERE split_part(replace(t.col2, ' ', ','), ',', n.n) IS NOT NULL AND split_part(replace(t.col2, ' ', ','), ',', n.n) != '' ORDER BY t.col1, col2;
核心逻辑说明
两种方法都先通过replace(col2, ' ', ',')把空格统一替换成逗号,消除不同分隔符的差异,再用拆分函数提取单个元素,最后关联原始行的其他列得到目标结果。
内容的提问来源于stack exchange,提问作者Codegator
相关产品推荐
相关产品推荐

