如何在dbt_project.yml中扩展变量并让SQL正确解析为集合?
解决dbt变量集合解析为SQL集合的问题
问题重现
在dbt_project.yml中定义集合变量并尝试扩展:
vars: var1_tuple: [item1, item2, item3] # 现有集合 var2: '{{ (var(''var1'') + ['install']) | join(", ") }}'
在table.sql中使用时:
WHERE column1 "{{ var(''var2'') }}"
执行失败,因为var2被解析为普通字符串,无法作为SQL集合使用。
正确解决方案
步骤1:保留变量的集合类型
先在dbt_project.yml中合并集合,不要直接转成字符串,同时注意给字符串元素加引号(避免dbt将其识别为变量):
vars: var1_tuple: ['item1', 'item2', 'item3'] # 扩展集合:添加单个元素,未来可直接拼接其他集合 var2: "{{ var('var1_tuple') + ['install'] }}"
步骤2:在SQL中转换为合法的集合语法
在table.sql里使用map('quote')给每个元素添加单引号,再用join(', ')拼接,最后配合IN子句使用:
WHERE column1 IN ({{ var('var2') | map('quote') | join(', ') }})
扩展场景:合并多个集合
如果未来需要合并多个集合,直接在var2中用+拼接即可:
vars: var1_tuple: ['item1', 'item2', 'item3'] another_tuple: ['foo', 'bar'] var2: "{{ var('var1_tuple') + var('another_tuple') + ['install'] }}"
SQL中的使用方式和上面一致。
原写法的问题说明
之前的写法直接将集合元素拼接成无引号的字符串,生成的SQL是WHERE column1 "item1, item2, item3, install",这不符合SQL语法规范——SQL判断集合归属需要用IN(),且每个元素必须单独加引号。
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

