在其他宏中声明 var 以在 DBT 的不同宏中使用
Declare var in other macro to be used in a different macro for DBT
主要思想是有一个常量变量,然后有可能在代码的其他部分或 DBT 的宏中使用它。
包含常量的宏示例:
{% macro constant_vars() -%}
{%
set var_1 = {
"0": ["0"],
"1": ["1", "11", "111"]
}
%}
{%
set var_2 = {
"2": ["2"],
"3": ["3"]
}
%}
{%- endmacro -%}
使用上一个宏常量的宏:
{% macro evaluate(
column_to_check
) -%}
CASE
{% for map_key in var_1 -%}
WHEN ({{column_to_check}} IN UNNEST( {{ var_1[map_key] }})) THEN
'{{ map_key }}'
{% endfor -%}
ELSE
"-1"
END
{%- endmacro -%}
SQL 为 DBT 创建的句子:
SELECT
[..]
evaluate(column1)
[..]
FROM
table
DBT 编译查询:
SELECT
[..]
CASE
WHEN (column1 IN UNNEST(["0"])) THEN
'0'
WHEN (column1 IN UNNEST(["1", "11", "111"])) THEN
'1'
ELSE
"-1"
END
[..]
FROM
table
可能吗?存在另一种方法吗?
谢谢!
您使用 {% set my_var = ... %}
声明的变量在范围内是局部的,这意味着它们不会在您设置它们的位置之外的任何上下文中声明。
dbt 还支持 var
宏,它可以充当全局变量。 Docs for var
您在 dbt_project.yml
文件中设置 var
如下:
vars:
var_1:
0: ["0"]
1: ["1", "11", "111"]
然后使用 {{ var('var_1') }}
访问这些值
主要思想是有一个常量变量,然后有可能在代码的其他部分或 DBT 的宏中使用它。
包含常量的宏示例:
{% macro constant_vars() -%}
{%
set var_1 = {
"0": ["0"],
"1": ["1", "11", "111"]
}
%}
{%
set var_2 = {
"2": ["2"],
"3": ["3"]
}
%}
{%- endmacro -%}
使用上一个宏常量的宏:
{% macro evaluate(
column_to_check
) -%}
CASE
{% for map_key in var_1 -%}
WHEN ({{column_to_check}} IN UNNEST( {{ var_1[map_key] }})) THEN
'{{ map_key }}'
{% endfor -%}
ELSE
"-1"
END
{%- endmacro -%}
SQL 为 DBT 创建的句子:
SELECT
[..]
evaluate(column1)
[..]
FROM
table
DBT 编译查询:
SELECT
[..]
CASE
WHEN (column1 IN UNNEST(["0"])) THEN
'0'
WHEN (column1 IN UNNEST(["1", "11", "111"])) THEN
'1'
ELSE
"-1"
END
[..]
FROM
table
可能吗?存在另一种方法吗?
谢谢!
您使用 {% set my_var = ... %}
声明的变量在范围内是局部的,这意味着它们不会在您设置它们的位置之外的任何上下文中声明。
dbt 还支持 var
宏,它可以充当全局变量。 Docs for var
您在 dbt_project.yml
文件中设置 var
如下:
vars:
var_1:
0: ["0"]
1: ["1", "11", "111"]
然后使用 {{ var('var_1') }}