提供包含SQL查询结果的Jinja列表



我是DBT和Jinja的新手,想知道是否可以使用SQL查询动态定义列表。而不是手动声明列表的项,如:

{% set myOrders = [123,234, 345, 456, 567] %}

用SQL查询定义列表,如下所示:

{% set myOrders = SELECT DISTINCT OrderNum FROM OrdersTable ORDER BY OrderNum  %}

这可能吗?

谢谢!

是的!不像你写的那样,但它是支持的。

首先,需要注意的是,这本身就很困难,因为DBT通常分两个阶段运行:
  1. 模板被编译以进行实际的SQL查询(即所有的Jinja被执行)
  2. 编译的SQL查询被执行

但是有一个构造{% if execute %},它允许您将编译推迟到执行阶段。

直接将文档中的示例改编为您的用例:

{% set my_orders_query %}
SELECT DISTINCT OrderNum
FROM {{ ref('OrdersTable') }}
ORDER BY OrderNum
{% endset %}
{% set rows = run_query(my_orders_query) %}
{% if execute %}
{# Return the first column #}
{% set myOrders = rows.columns[0].values() %}
{% else %}
{% set myOrders = [] %}
{% endif %}