
本文介绍使用 DuckDB 的列表推导式与 list_bool_or() 函数,高效筛选嵌套结构列表列(如 struct[])中任意元素的某个字段(如 b)包含子字符串(如 'bt')的整行数据。
本文介绍使用 duckdb 的列表推导式与 list_bool_or() 函数,高效筛选嵌套结构列表列(如 struct[])中任意元素的某个字段(如 b)包含子字符串(如 'bt')的整行数据。
在 DuckDB 中处理嵌套数据类型(如 struct(a VARCHAR, b VARCHAR)[])时,直接对列表内每个结构体的字段进行条件过滤需借助其强大的列表函数和 Lambda 表达式能力。核心思路是:对每行的列表列执行逐元素判断,生成布尔列表,再用逻辑或聚合判定该行是否满足“至少一个元素匹配”条件。
以下为完整可运行示例:
import duckdb
rel = duckdb.sql("""
FROM VALUES
([{'a': 'foo', 'b': 'bta'}]),
([]),
([{'a': 'jun', 'b': 'jul'}, {'a':'nov', 'b': 'obt'}])
AS df(my_col)
SELECT *
WHERE list_bool_or(['bt' IN s.b FOR s IN my_col])
""")
print(rel)✅ 输出结果:
┌──────────────────────────────────────────────┐
│ my_col │
│ struct(a varchar, b varchar)[] │
├──────────────────────────────────────────────┤
│ [{'a': foo, 'b': bta}] │
│ [{'a': jun, 'b': jul}, {'a': nov, 'b': obt}] │
└──────────────────────────────────────────────┘关键要点解析
-
列表推导式
['bt' IN s.b FOR s IN my_col]:遍历my_col中每个struct元素s,提取其b字段并判断是否包含子串'bt',返回布尔值列表(如[True]、[]、[False, True])。 -
list_bool_or():对布尔列表执行逻辑或运算——空列表返回FALSE,含至少一个TRUE即返回TRUE,完美匹配“存在任一匹配项”的语义。 -
空列表安全:当
my_col为[]时,推导式结果为空列表[],list_bool_or([])返回FALSE,该行被自然过滤,无需额外IS NOT NULL或长度判断。
⚠️ 注意事项:
- 字段访问语法必须严格为
s.field_name(如s.b),不可写作s['b']或s."b"; - 子串判断使用
IN(非LIKE或正则),简洁高效;若需更复杂模式匹配,可替换为REGEXP_MATCHES(s.b, 'bt'); -
list_apply(my_col, s -> 'bt' IN s.b)是等价写法,但list_bool_or()+ 推导式更直观易读。
此方法兼具表达力与性能,是 DuckDB 处理嵌套条件过滤的标准实践。

















