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

如何在DBT中使用Jinja遍历嵌套struct并提取指定value字段

解决方案

你之前的代码不生效的核心原因是:Jinja是DBT的编译期模板工具,运行时无法直接读取SQL查询结果里的struct内部字段,你需要先通过DBT的内置方法拿到properties结构体的所有子字段名,再做遍历。

方案1:子struct命名有统一规律(如property1~propertyN)

如果你的子struct都是按property+数字的规则命名,直接遍历数字范围即可,写法最简单:

WITH t as (
    SELECT
        properties
    FROM
        src
)
SELECT
    {% for i in range(1, 101) %}
    properties.property{{i}}.value as property{{i}}_value
    {%- if not loop.last %},{% endif %}
    {% endfor %}
FROM
    t

方案2:子struct命名无规律,需要自动读取字段名

用DBT的adapter.get_columns_in_query方法先查询一次表结构,拿到properties下的所有子字段名,再做遍历:

{# 先拿到properties结构体的所有子字段名 #}
{% set property_cols = [] %}
{% set all_cols = adapter.get_columns_in_query('SELECT properties FROM src LIMIT 0') %}
{% for col in all_cols[0].fields %}
  {% do property_cols.append(col.name) %}
{% endfor %}

WITH t as (
    SELECT
        properties
    FROM
        src
)
SELECT
    {% for prop_name in property_cols %}
    properties.{{prop_name}}.value as {{prop_name}}_value
    {%- if not loop.last %},{% endif %}
    {% endfor %}
FROM
    t

注:如果你的数据仓库是Snowflake,fields属性可能需要换成column.fields,BigQuery环境上述写法可直接生效。如果执行报错,可以先加{{ log(all_cols[0], info=True) }}打印字段结构,调整取值逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:15:04