如何在Redshift中使用SPLIT_PART将整列按单词拆分?
Redshift 拆分字符串为多行的正确方法
你的split_part语句无法实现需求,因为这个函数只能提取拆分后的指定位置的单个元素,不能将所有拆分结果展开成多行。要实现按空格拆分每个单词并单独占一行,可以用以下两种方法:
方法一:使用STRING_TO_ARRAY + UNNEST(推荐,适合Redshift 1.0.2368及以上版本)
Redshift较新版本支持UNNEST函数,可以将数组的每个元素展开为单独的行,配合STRING_TO_ARRAY先把字符串转成数组:
SELECT t.name, unnest(string_to_array(t.answer, ' ')) AS split_answer FROM your_table t
如果你的数据里存在连续空格,会产生空的拆分结果,可以加上过滤条件去除空值:
SELECT t.name, word AS split_answer FROM your_table t, unnest(string_to_array(t.answer, ' ')) AS word WHERE word IS NOT NULL AND word != ''
方法二:递归CTE(兼容旧版本Redshift)
如果你的Redshift版本不支持UNNEST,可以用递归公共表表达式(CTE)逐行拆分字符串:
WITH RECURSIVE split_words AS ( -- 初始步骤:提取第一个单词和剩余字符串 SELECT name, split_part(answer, ' ', 1) AS split_answer, TRIM(SUBSTR(answer, LENGTH(split_part(answer, ' ', 1)) + 1)) AS remaining FROM your_table WHERE answer IS NOT NULL AND answer != '' UNION ALL -- 递归步骤:继续拆分剩余字符串 SELECT name, split_part(remaining, ' ', 1) AS split_answer, TRIM(SUBSTR(remaining, LENGTH(split_part(remaining, ' ', 1)) + 1)) AS remaining FROM split_words WHERE remaining IS NOT NULL AND remaining != '' ) SELECT name, split_answer FROM split_words WHERE split_answer IS NOT NULL AND split_answer != '' ORDER BY name;
注意:将代码中的your_table替换为你的实际表名。
内容的提问来源于stack exchange,提问作者Dizz
相关产品推荐
相关产品推荐

