嗨,我们如何在dbt中将select语句定义为变量?

问题描述

嗨,我想在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 %}