【问题标题】:Concatenate columns using a macro in DBT for Redshift使用 DBT for Redshift 中的宏连接列
【发布时间】:2021-02-17 20:46:11
【问题描述】:

我想在 DBT for Redshift 中使用 column1 ^^ column2 ^^ ... 语法连接几列。如果列 @@ 中有 NULL 值,则应使用,导致 f.e. @@ ^^ @@。我找到了以下用于连接的宏:

{% macro safe_concat(field_list) %}
  {# Takes an input list and generates a concat() statement with each argument in the list safe_casted to a string and wrapped in an ifnull() #}
  concat({% for f in field_list %}
    ifnull(safe_cast({{ f }} as string), '@@')
    {% if not loop.last %}, {% endif %}
  {% endfor %})
{% endmacro %}

当我在我的选择语句中使用它时:

select
  {{ safe_concat([street, city]) }} as address_key
from source

我收到以下错误。这与我使用的代码有关吗?

Database Error in model address (models/address.sql)
  syntax error at or near "as"
  LINE 32:     ifnull(safe_cast( as string), '@@')

【问题讨论】:

    标签: sql macros concatenation dbt


    【解决方案1】:

    尝试在宏中调用列名时将它们括在引号中 - 我认为它正在尝试传入变量 streetcity(因为您已经在大括号内),但没有存在所以正在评估None

    【讨论】:

    • 如果我将列名用引号括起来,这就是我得到的:syntax error at or near "as" LINE 32: ifnull(safe_cast(street as string), '@@') ^ compiled SQL at target/run/project/models/address.sql
    • 您能否向我们展示原始和编译的 SQL 以及引号?
    • 这是宏的编译输出(调用为{{ safe_concat(['street', 'city']) }} as address_key,):concat( ifnull(safe_cast(street as string), '@@') , ifnull(safe_cast(city as string), '@@') )
    • 忘了说 Redshift 是目标数据库,相应地修改了问题。这与宏中使用的函数的风格有关。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2022-08-03
    • 2016-11-20
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多