您好我正在尝试在 dbt 中的 set 变量中定义一个 select 语句,任何人都可以建议如何将 sql 查询设置为 dbt 中的变量以及如何在下面的 CTE 中访问这些变量?
问问题
7797 次
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 回答