如何用单条SQL查询匹配部分WHERE子句条件的行?(Postgres)
用单条PostgreSQL查询满足部分条件的行
完全可以用单条SQL实现,不用在Ruby里循环执行多个宽泛查询,PostgreSQL的特性刚好能搞定这个需求。
核心思路是把每个条件的匹配结果转成整数(true对应1,false对应0),求和后筛选符合数量要求的行:
示例1:查询满足至少2个条件的行
SELECT * FROM widgets WHERE (is_hard = true)::int + (is_blue = false)::int + (region = 'NYC')::int + (kind = 'Deluxe')::int >= 2;
示例2:精确匹配3个条件的行
把判断条件改成= 3即可:
SELECT * FROM widgets WHERE (is_hard = true)::int + (is_blue = false)::int + (region = 'NYC')::int + (kind = 'Deluxe')::int = 3;
额外优化:查看每行匹配的条件数量
如果需要知道每行具体匹配了几个条件,可以把求和结果作为字段返回:
SELECT *, (is_hard = true)::int + (is_blue = false)::int + (region = 'NYC')::int + (kind = 'Deluxe')::int AS matched_count FROM widgets WHERE matched_count >= 2;
这种方式效率高,不需要多次查询数据库,直接在单条SQL里完成所有筛选逻辑。
内容的提问来源于stack exchange,提问作者Manny_G
相关产品推荐
相关产品推荐

