当宏中的参数在 dbt 中为 null 时的 if 语句

If statement when a parameter in the macro is null in dbt

我是 DBT 的新手,所以也许你们可以帮助我创建这个宏。我有一个宏,如下所示:

{% macro finding_number(missing_arn, acquirer_id, min_date, max_date) %}

{% set query %}

  select 
       *
  from {{ ref('hola') }}
  where event_date::date between '{{min_date}}' and '{{max_date}}'
    and acquirer_id = {{acquirer_id}} 
    and acquirer_reference_number = '{{missing_arn}}'

{% endset %}

{% set results = run_query(query) %}

{%endmacro%}

这里有什么问题?在某些情况下,我可能没有 acquirer_id 或日期来填充宏的参数。查找以下示例:

dbt run-operation finding_number --args '{missing_arn: xyz}'

因此,如果我没有这些参数的值并且我尝试 运行 宏,它会给我一个错误,因为我没有为这些参数分配任何值(acquirer_id、min_date 和 max_date)。 我已经看到如果您没有为这些参数分配任何内容,可以通过使用多个 If 语句“跳转”查询中 where 语句中的那些条件来解决这个问题,但我不知道如何构造它们。对于这种情况,因为我们只有 missing_arn,if 语句需要“跳过”where 语句中的 acquirer_id、min_date 和 max_date 条件,如我们没有为这两个参数分配任何值,以便能够 运行 宏。

谢谢!

我将如何构建它来快速解决这个问题……

{% macro finding_number(missing_arn, acquirer_id, min_date, max_date) %}

{% set query %}

  select 
       *
  from {{ ref('hola') }}
  where acquirer_reference_number = '{{missing_arn}}'
    {{%- if min_date is not none and max_date is not none -%}} and event_date::date between '{{min_date}}' and '{{max_date}}' {%- endif -%}
    {{%- if acquirer_id is not none -%}} and acquirer_id = {{acquirer_id}} {%- endif -%}

{% endset %}

{% set results = run_query(query) %}

{%endmacro%}

我没有包含 missing_arn 的 if 语句,因为您询问了一个您确实有的场景,但是,您可以应用相同的逻辑模式……

  where 1=1
    {{%- if missing_arn is not none -%}} and acquirer_reference_number = '{{missing_arn}}' {{%- endif -%}}

where 1=1 允许它仍然 运行 如果所有三个都丢​​失或参数的不同组合被遗漏。 还没有测试过这个,但试一试。

可选,以防您有最短日期但没有最晚日期,反之亦然:

{{%- if min_date is not none -% }} and event_date::date >= '{{min_date}}' {%- endif -%}
{{%- if max_date is not none -% }} and event_date::date <= '{{max_date}}' {%- endif -%}