是否有一种方法可以在Jinja for循环中嵌套Jinja集合?



我目前在DBT中使用Jinja来创建这三个集合,它们都工作得很好:

{% set value1 %}
select
category1,
category2,
category3,
category4

from {{ ref('table') }}
where category1 = 'value1'
order by category2

{% endset %}
{% set value2 %}
select
category1,
category2,
category3,
category4

from {{ ref('table') }}
where category1 = value2
order by category2

{% endset %}

{% set value3 %}
select
category1,
category2,
category3,
category4

from {{ ref('table') }}
where category1 = value3
order by category2

{% endset %}

我想知道是否有一种方法可以通过使用for循环来压缩这三个集合的创建。

这是我的尝试:

{% set attributes = ('value1', 'value2', 'value3') %}

{% for i in attributes%}

{% set {{i}} %}

select
category1,
category2,
category3,
category4

from {{ ref('table') }}
where category1 = {{i}}
order by category2

{% endset %}

{% endfor %}

我一直遇到关于for循环中set的第一行的错误。我已经尝试了几种方法来编写它,在for循环中改变语法,但没有任何效果。

我想知道我是否可以以任何方式重新创建三个集合的输出,这将比必须写出所有三个集合更谦虚?

您的用例似乎非常适合使用宏:

定义宏:

{% macro get_set(value) %}
select
category1,
category2,
category3,
category4
from {{ ref('table') }}
where category1 = {{ value }}
order by category2
{% endmacro %}

然后使用:

{{ get_set('value1') }}
{# and #}
{{ get_set('value2') }}
{# and #}
{{ get_set('value3') }}

最新更新