使用dbt宏实现Snowflake动态列PIVOT的语法报错问题咨询
错误原因
dbt_utils.get_column_values默认返回Jinja列表对象,直接嵌入SQL时会序列化出[]符号,不符合Snowflake PIVOT语法对IN子句的格式要求。你尝试的as_native参数仅控制返回值的Jinja类型,不会修改序列化到SQL时的格式,列表类型不管是不是原生类型,直接输出都会带[],因此无法解决问题。
修复方案(两种可选)
方案1:过滤器拼接字符串(通用推荐)
使用Jinja过滤器将列表处理为符合要求的逗号分隔带引号字符串,修正后代码如下:
with pivot as ( select * from {{ ref('my_base_model') }} pivot( sum(VALUE) for KEY in ( {{ dbt_utils.get_column_values(table=ref('my_base_model'), column='KEY') | map('quote') | join(', ') }} ) ) ) select * from pivot
说明:map('quote')会为每个列值添加单引号,join(', ')将列表拼接为逗号分隔的字符串,编译后IN子句会生成('value_1', 'value_2', 'value_3'...)的标准格式,完全符合Snowflake语法要求。如果你的KEY值包含空格、特殊符号需要作为标识符识别,可以将map('quote')替换为map('double_quotes'),生成双引号包裹的列值适配场景。
方案2:转Jinja元组简化写法
直接将返回的列表转为Jinja元组,无需额外加IN子句的外层括号,写法如下:
with pivot as ( select * from {{ ref('my_base_model') }} pivot( sum(VALUE) for KEY in {{ tuple(dbt_utils.get_column_values(table=ref('my_base_model'), column='KEY')) }} ) ) select * from pivot
内容的提问来源于stack exchange,提问作者sgdata
相关产品推荐
相关产品推荐

