Ruby:查询PostgreSQL数组列长度大于1的ActiveRecord记录
查询PostgreSQL数组列长度大于1的记录
直接在数据库层面过滤是最高效的方案,避免全量拉取数据到内存后处理,以下是两种可行实现方式:
Rails ActiveRecord 写法
利用PostgreSQL的数组函数直接构建查询条件:
方式1:使用array_length函数
TrackingInfo.where("array_length(tracking_numbers, 1) > 1")
array_length的第二个参数1表示数组的维度(这里是一维数组)。
方式2:使用cardinality函数
cardinality函数直接返回数组的元素个数,写法更简洁:
TrackingInfo.where("cardinality(tracking_numbers) > 1")
原生SQL 查询语句
如果需要直接执行SQL,对应的语句如下:
SELECT * FROM tracking_infos WHERE array_length(tracking_numbers, 1) > 1; -- 或使用cardinality SELECT * FROM tracking_infos WHERE cardinality(tracking_numbers) > 1;
注意:之前用
TrackingInfo.all.pluck(:tracking_numbers)后处理的方式会将所有记录的数组字段加载到内存中过滤,数据量较大时会严重影响性能,推荐使用上述数据库端过滤的方案。
内容的提问来源于stack exchange,提问作者ToddT
相关产品推荐
相关产品推荐

