我创建了一个宏,从full_name中提取last_name并返回last_name
{% macro parse_last_name(column_name) %}
{% if column_name is none %}
{{ return (column_name) }}
{% else %}
{{ return (column_name.split(',')[1]) }}
{%endif%}
{% endmacro %}
这在我的dbt型号中被称为
select
{{parse_last_name('FULL_NAME')}} AS LAST_NAME
from <table_schema>
但是编译的SQL是:
select
AS LAST_NAME
from <target_schema>
所以我的宏没有返回任何内容。
我正在使用dbt run --select model_name.sql
运行我的模型
我在这里做错了什么?
宏有两个问题:
- 您不希望使用
return
关键字。return
在jinja上下文中将数据传递回调用者,但实际上您正试图在这里编写SQL代码 - 数据不会在jinja上下文中流动。当您编写
column_name.split(',')[1]
时,您实际上是在拆分作为字符串传入的列的NAME,而不是该列的数据。换句话说,您的宏相当于"LAST_NAME".split(",")[1]
您需要宏返回SQL来为您进行此解析。像这样的东西可以(在Snowflake上(:
{% macro parse_last_name(column_name) %}
split_part({{ column_name }}, ',', 2)
{% endmacro %}
请注意,这使用了SQL函数split_part
,因此在编译模型时,它将变为有效的SQL:
select
split_part(LAST_NAME, ',', 2) AS LAST_NAME
from <target_schema>