在其他宏中声明 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') }}

访问这些值