You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:36:03