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

Swe*_*ety 4 dbt

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

Jav*_*tón 8

您可以使用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] -%}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用 {{ my_var }}

您可以['data'][0][0]根据选择返回的行和列进行操作


Paw*_*wel 5

您可以考虑将 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 %}
Run Code Online (Sandbox Code Playgroud)

然后您可以在模型中使用上述宏。例如,在下面的模型中,如果列中的值column_a_boolean相等,我们会联合记录宏返回的记录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 %}
Run Code Online (Sandbox Code Playgroud)

  • 你如何实现 run_query() ? (2认同)