You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jinja从Redshift的super类型字典列表提取拼接值?

解决Redshift中Super类型字典数组转逗号分隔字符串的问题

问题原因分析

你之前的代码混用了Jinja模板语法和SQL运行时逻辑,导致temp_list为空:

  • Jinja模板是在SQL语句生成阶段执行的,此时还没有查询数据,ids_array只是一个列名的字符串,不是实际的数组数据。
  • 你的Jinja循环遍历的是字符串ids_array,不是查询运行时的数组元素,所以temp_list不会添加任何内容,最终返回空值。

正确解决方案

利用Redshift对Super类型的原生支持,通过UNNEST展开数组,再用LISTAGG聚合拼接字符串,无需依赖Jinja模板:

方法1:UNNEST + LISTAGG(推荐)

SELECT
    main.id,
    -- 处理空数组的情况,用COALESCE转为空字符串
    COALESCE(LISTAGG(unnested_item.id::VARCHAR, ',') WITHIN GROUP (ORDER BY unnested_item.id), '') AS ids
FROM schema_name.table_name main
-- 展开tests.tests.ids数组,LEFT JOIN保留原表所有行(包括数组为空的情况)
LEFT JOIN UNNEST(main.tests.tests.ids) AS unnested_item(id) ON TRUE
GROUP BY main.id;

方法2:使用JSON函数(适合简单场景)

如果数组长度固定或需要更细粒度控制,也可以用json_extract_path_text结合数组索引,但不适合长度可变的场景:

SELECT
    id,
    -- 手动拼接多个元素,需要根据最大长度调整
    TRIM(
        CONCAT_WS(',',
            json_extract_path_text(json_extract_array_element_text(tests.tests.ids, 0), 'id'),
            json_extract_path_text(json_extract_array_element_text(tests.tests.ids, 1), 'id'),
            json_extract_path_text(json_extract_array_element_text(tests.tests.ids, 2), 'id')
        ),
        ','
    ) AS ids
FROM schema_name.table_name;

说明

  • UNNEST(main.tests.tests.ids):将Super类型的数组展开为多行,每行对应一个字典元素。
  • unnested_item.id:直接从展开的字典元素中提取id值(Redshift支持对Super类型的字典用.访问属性)。
  • LISTAGG(...):将同一主表id下的所有id值拼接为逗号分隔的字符串,WITHIN GROUP可选用于排序。
  • COALESCE:当数组为空时,返回空字符串而非NULL。

内容的提问来源于stack exchange,提问作者lollerskates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:43:10