如何在PostgreSQL JSON列中用IN语句查询多个item_code
解决方法
要实现类似普通IN语句的查询方式,你可以借助PostgreSQL的jsonb_array_elements函数把JSON数组拆分为单行记录,之后就能直接用IN来匹配多个item_code值了,具体分两种场景:
1. 查询包含任意指定item_code的pricing_rule记录
如果需要找出所有包含目标item_code中任意一个的完整记录,用EXISTS子查询避免重复返回同一记录:
SELECT * FROM pricing_rule WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements(items::jsonb) AS item_obj WHERE item_obj->>'item_code' IN ('Fadge Chocolate Box (4.0 Box)', 'UMI MAIZE Box (10.0 PC)') );
2. 提取所有匹配的item_code条目
如果需要像原查询那样返回每个匹配的item_code值(一个pricing_rule有多个匹配时会返回多行),直接用交叉连接拆分数组后过滤:
SELECT item_obj->>'item_code' AS item_code FROM pricing_rule, jsonb_array_elements(items::jsonb) AS item_obj WHERE item_obj->>'item_code' IN ('Fadge Chocolate Box (4.0 Box)', 'UMI MAIZE Box (10.0 PC)');
补充说明
- 如果你的
items列本身就是jsonb类型,可以去掉::jsonb的类型转换,直接使用items。 jsonb_array_elements函数的作用是把JSON数组展开成多行,每一行对应数组里的一个对象,这样就能把JSON内部的字段当作普通表字段来使用IN条件了。
内容的提问来源于stack exchange,提问作者justrying
相关产品推荐
相关产品推荐

