问题描述
嗨,我想在dbt的set变量中定义一个select语句, 谁能建议如何将SQL查询设置为dbt中的变量,以及如何在CTE下访问这些变量?
解决方法
您可以使用call statement
并使用load_result
将变量中的结果获取
这里是从select语句中仅检索一个字段的示例:
{%- call statement('my_statement',fetch_result=True) -%}
SELECT my_field FROM my_table
{%- endcall -%}
{%- set my_var = load_result('my_statement')['data'][0][0] -%}
然后您可以使用{{ my_var }}
您可以根据选择返回的行和列来玩['data'][0][0]
您可以考虑将SQL语句嵌入宏中,然后在模型中调用该宏。
{% macro get_data() %}
{% set query %}
select
column_a_boolean,column_b_varchar
from my_table
{% endset %}
{% set results = run_query(query) %}
{# execute is a Jinja variable that returns True when dbt is in "execute" mode i.e. True when running dbt run but False during dbt compile. #}
{% if execute %}
{% set results_list = results.rows %}
{% else %}
{% set results_list = [] %}
{% endif %}
{{ return(results_list) }}
{% endmacro %}
然后可以在模型中使用上面的宏。
例如,在下面的模型中,如果列column_a_boolean
中的值等于true
,则UNION记录宏返回的值。
{% for record in get_data() %}
{% if record.column_a_boolean == true %}
{% if not loop.first %}
UNION ALL
{% endif %}
SELECT
record.column_b_varchar
{% endif -%}
{% endfor %}