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

能否在DBT中通过Jinja用SQL查询动态定义列表?

用SQL动态定义Jinja列表的方法

完全可行,但不能直接把SQL语句赋值给变量,得借助dbt提供的run_query宏来执行SQL并获取结果,再转换成Jinja列表。以下是两种常用实现方式:

方法一:手动用run_query处理结果

{# 先定义要执行的SQL查询 #}
{% set order_num_query %}
SELECT DISTINCT OrderNum FROM {{ ref('OrdersTable') }} ORDER BY OrderNum
{% endset %}

{# 执行查询并获取结果集 #}
{% set myOrders_result = run_query(order_num_query) %}

{# 把结果集的第一列值转换成列表 #}
{% if myOrders_result %}
    {% set myOrders = myOrders_result.columns[0].values() %}
{% else %}
    {% set myOrders = [] %}
{% endif %}

方法二:用dbt_utils的get_column_values宏(更简洁)

如果你安装了dbt_utils包,可以直接用封装好的宏来获取列值列表:

{% set myOrders = dbt_utils.get_column_values(
    table=ref('OrdersTable'),
    column='OrderNum',
    distinct=True,
    order_by='OrderNum'
) %}

注意点

  • 用ref('OrdersTable')代替直接写表名,能让dbt自动识别模型依赖,保证执行顺序正确。
  • 记得处理空结果的情况,避免后续代码因列表为空报错。
  • run_query返回的是结果集对象,必须提取列值才能得到可用的Jinja列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:15:38