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

在DBT中如何检查带分隔符字符串的所有值是否存在于指定列表?

如何验证带分号分隔值的列中所有元素都属于指定列表?

针对你的场景,有两种常用方法可以实现类似Python中all(item in List1 for item in List2)的验证逻辑:

方法1:拆分后展开行(直观易维护)

把带分隔符的列拆成数组,再展开成单独的行,直接用accepted_values测试展开后的每个值。这种方式逻辑清晰,出错时能直接看到具体哪个值不符合要求。

示例dbt测试代码:

models:
  - name: 你的模型名
    tests:
      - accepted_values:
          column_name: 拆分后的值
          values: ['a', 'b', 'c', 'd']
          # 可选:排除空值行,避免干扰
          where: "你的列名 is not null"
          sql: |
            select unnest(split_to_array(你的列名, ';')) as 拆分后的值
            from {{ ref('你的模型名') }}

注:unnest是PostgreSQL的函数,不同数据库可能有差异,比如BigQuery用UNNEST,MySQL用JSON_TABLE实现类似功能。

方法2:用数组函数直接验证(无需展开行)

如果不想生成额外行,可以用数据库的数组子集判断逻辑,直接验证拆分后的数组所有元素都在允许列表内。以PostgreSQL为例:

models:
  - name: 你的模型名
    tests:
      - custom_sql:
          sql: |
            select *
            from {{ ref('你的模型名') }}
            where 你的列名 is not null
              -- 拆分后移除空元素,再检查是否是允许值数组的子集
              and not (array_remove(split_to_array(你的列名, ';'), '') <@ array['a', 'b', 'c', 'd'])

这段SQL会返回所有包含非法值的行,只要有返回结果,测试就会失败。

如果是其他数据库,比如BigQuery,可以这样写:

select *
from {{ ref('你的模型名') }}
where 你的列名 is not null
  and exists (
    select 1
    from unnest(split(你的列名, ';')) as elem
    where elem not in ('a', 'b', 'c', 'd')
  )

内容的提问来源于stack exchange,提问作者Raksha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:11:14