能否在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
相关产品推荐
相关产品推荐

