如何在dbt jinja中将两列数据合并为字典循环生成case when语句
dbt Jinja 双列表合并生成case when的实现方案
dbt模板基于Jinja2语法,有两种常用实现方式可解决你的需求:
方案1:直接遍历打包后的双列表(无需转字典,最简便)
你可以直接用Jinja内置的zip过滤器将两个列表按顺序配对,直接循环取值,无需额外转换为字典,代码示例:
-- 你已经生成的两个列表,长度必须保持一一对应 {% set feeder_list = ['%United-States%', '%USA%', '%UK%'] %} {% set correct_list = ['United States', 'United States', 'United Kingdom'] %} select case {% for feeder, correct in feeder_list | zip(correct_list) %} when lower(locationname) like '{{ feeder }}' then '{{ correct }}' {% endfor %} -- 建议加默认值兜底未匹配的场景 else locationname end as city from 你的业务表名
注意:两个列表的顺序必须严格对应,相同索引的元素即为一组配对的匹配值和修正值
方案2:先合并为字典再遍历
如果你的场景需要把配对值存为字典复用,可以用dict()函数把打包后的列表转为字典:
{% set feeder_list = ['%United-States%', '%USA%', '%UK%'] %} {% set correct_list = ['United States', 'United States', 'United Kingdom'] %} -- 合并为可复用的字典 {% set locations = dict(feeder_list | zip(correct_list)) %} select case {% for feeder, correct in locations.items() %} when lower(locationname) like '{{ feeder }}' then '{{ correct }}' {% endfor %} else locationname end as city from 你的业务表名
注意:如果feeder列表有重复值,转字典后重复键对应的value会被最后一个同键元素覆盖,该场景优先使用方案1
注意事项
- 字符串类型的匹配值和修正值需要加引号包裹,否则生成的SQL会出现语法错误
- 建议在case语句末尾加
else分支兜底,避免未匹配到的场景生成null值
内容的提问来源于stack exchange,提问作者Javier. Diez
相关产品推荐
相关产品推荐

