Redshift中拆分逗号分隔列并实现表关联的方法咨询
Redshift中拆分逗号分隔列并关联表的实现方法
针对你的需求,这里提供两种在Redshift中拆分gti列(逗号分隔字符串)并与表b关联的可行方案,同时解决SPLIT_PART中n值不确定的问题:
方法一:动态生成序列结合SPLIT_PART
如果你的Redshift版本不支持更便捷的拆分函数,可以用这种方式:
- 先获取
gti列中最多包含多少个分隔值,以此确定SPLIT_PART的最大n值:
SELECT MAX(REGEXP_COUNT(gti, ',') + 1) FROM a;
REGEXP_COUNT(gti, ',')统计逗号数量,加1就是该字段拆分后值的个数,取最大值就能覆盖所有行的拆分需求。
- 生成数字序列并拆分关联:
WITH num_series AS ( -- 动态获取最大拆分个数,无需硬编码 SELECT GENERATE_SERIES(1, (SELECT MAX(REGEXP_COUNT(gti, ',') + 1) FROM a)) AS n ), split_a AS ( SELECT a.*, -- 去除拆分后值的前后空格,避免关联匹配失败 TRIM(SPLIT_PART(a.gti, ',', num_series.n)) AS single_gti FROM a JOIN num_series ON num_series.n <= REGEXP_COUNT(a.gti, ',') + 1 ) SELECT * FROM split_a JOIN b ON split_a.single_gti = b.gti;
方法二:使用REGEXP_SPLIT_TO_TABLE(推荐,Redshift 1.0.2177+支持)
Redshift较新版本提供了REGEXP_SPLIT_TO_TABLE函数,可直接将逗号分隔字符串拆分为多行,无需手动处理序列:
WITH split_a AS ( SELECT a.*, TRIM(gti_part) AS single_gti FROM a, -- 按逗号拆分gti列,生成多行 REGEXP_SPLIT_TO_TABLE(a.gti, ',') AS gti_part ) SELECT * FROM split_a JOIN b ON split_a.single_gti = b.gti;
关键注意事项
- 必须用
TRIM处理拆分后的值:你的gti列中逗号后带有空格(如abc, def),不处理的话会导致和表b的gti值(如def)无法匹配。 - 若使用方法一,动态获取最大拆分个数比硬编码
n值更稳妥,避免后续数据新增拆分值时出现遗漏。
内容的提问来源于stack exchange,提问作者bobaboba
相关产品推荐
相关产品推荐

