DBT测试报错:operator does not exist: text[] <@ text[] 求解决方案
解决DBT测试中数组包含关系的报错问题
问题场景
需要验证某列中分号分隔的字符串元素是否全部存在于指定列表['a','b','c','d']中,列数据示例:
a;b;c b c;b d;b;a;c
使用的DBT测试配置:
models: - name: my_model tests: - dbt_utils.expression_is_true: expression: "string_to_array(column, ';') <@ array['a','b','c','d']"
报错信息
执行测试后出现如下错误:
operator does not exist: text[] <@ text[] HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts.
解决方案
方案1:显式统一数组类型
报错原因是PostgreSQL中<@操作符要求两边数组类型严格匹配,虽string_to_array和array[]都返回text[],但可能因DBT上下文或数据库配置导致类型识别不一致。通过显式将两边转换为varchar[](或text[])即可解决:
models: - name: my_model tests: - dbt_utils.expression_is_true: expression: "string_to_array(column, ';')::varchar[] <@ array['a','b','c','d']::varchar[]"
方案2:改用元素遍历检查
如果类型转换仍有问题,可以换一种逻辑:将分号分隔的字符串拆分为元素后,检查所有元素都在指定列表中:
models: - name: my_model tests: - dbt_utils.expression_is_true: expression: "NOT EXISTS (SELECT 1 FROM unnest(string_to_array(column, ';')) elem WHERE elem NOT IN ('a','b','c','d'))"
这种方式通过unnest展开数组,筛选不在目标列表的元素,若不存在这样的元素则验证通过,兼容性更强。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

