4

您好我正在尝试在 dbt 中的 set 变量中定义一个 select 语句,任何人都可以建议如何将 sql 查询设置为 dbt 中的变量以及如何在下面的 CTE 中访问这些变量?

4

2 回答 2

10

您可以使用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]根据您的选择返回的行和列进行操作

于 2020-09-22T10:12:11.740 回答
7

您可以考虑将 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中的值等于,我们将宏返回的 UNION 记录true

{% 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 %}
于 2020-09-24T20:40:19.207 回答