Ibis中是否存在ANY或ANY_VALUE表达式实现子查询值匹配?
解决方案:在Ibis中实现类似SQL ANY的筛选逻辑
方法1:使用.isin()方法(最常用)
这是最直观的替代方案,和SQL的IN/ANY逻辑完全一致。先提取col1的取值集合,再判断col0是否属于该集合:
import ibis # 构造内存表 t = ibis.memtable({'col0': [-2, -5, -1, 0, 1, 8, 7], 'col1': [0, -2, 4, 5, 6, 8, 7]}) # 提取col1的唯一值集合(去重可提升大表查询效率) col1_unique = t.col1.distinct() # 筛选col0存在于col1中的行 result = t.filter(t.col0.isin(col1_unique)) # 执行并查看结果 print(result.execute())
执行结果会返回符合条件的行:
| col0 | col1 |
|---|---|
| -2 | 0 |
| 0 | 5 |
| 8 | 8 |
| 7 | 7 |
方法2:使用.any()方法(严格对齐SQL语法)
Ibis提供了直接对应SQL ANY的列表达式方法,写法和原SQL逻辑几乎一致:
# 子查询获取col1的所有值 subquery = t.select(t.col1) # 使用.any()判断col0是否匹配子查询中任意值 result = t.filter(t.col0 == subquery.col1.any()) print(result.execute())
补充说明
.isin()是Ibis处理"值归属判断"的通用方法,可读性和性能表现都很稳定;.any()适合需要严格对齐原SQL写法的场景,语义和SQLANY完全等价;- 若
col1存在大量重复值,先通过distinct()去重再做判断,能减少不必要的匹配计算。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

