如何在PostgreSQL中对数组列使用BETWEEN条件?
解决PostgreSQL数组列结合ANY和BETWEEN的查询问题
你的问题很典型——PostgreSQL的数组操作语法和常规单值查询逻辑有差异,直接把ANY()放在BETWEEN左侧的写法不符合语法规则。下面给你几种可行的解决方案,各有优劣,你可以根据实际场景选择:
方法1:使用日期范围重叠操作符(推荐,性能最优)
PostgreSQL支持范围类型与数组的重叠判断,用&&操作符能直接判断数组中是否存在任意日期落在目标时间段内,写法简洁且效率极高(如果你的multiple_dates列建了GIN索引,性能会更出色):
SELECT * FROM companies WHERE multiple_dates && daterange('2019-06-01', '2019-06-30', '[]');
这里的'[]'表示闭区间,会同时包含起止日期(2019-06-01和2019-06-30)。如果不指定这个参数,daterange默认是左闭右开([)),此时要包含2019-06-30的话,需要把结束日期调整为'2019-07-01':
SELECT * FROM companies WHERE multiple_dates && daterange('2019-06-01', '2019-07-01');
方法2:用UNNEST+EXISTS子查询(可读性强)
把数组展开为单行记录,再检查是否有日期落在目标区间里,这种写法逻辑最直观,适合需要扩展复杂过滤条件的场景:
SELECT * FROM companies c WHERE EXISTS ( SELECT 1 FROM UNNEST(c.multiple_dates) AS d(date) WHERE d.date BETWEEN '2019-06-01' AND '2019-06-30' );
方法3:拆分BETWEEN为两个ANY条件
既然BETWEEN a AND b等价于>=a AND <=b,我们可以把条件拆成两个独立的ANY判断,写法同样简洁:
SELECT * FROM companies WHERE '2019-06-01' <= ANY(multiple_dates) AND ANY(multiple_dates) <= '2019-06-30';
这种写法不需要依赖范围类型,但性能不如方法1,尤其是数据量较大时。
内容的提问来源于stack exchange,提问作者ironsand
相关产品推荐
相关产品推荐

