PostgreSQL:查询clients表中嵌套数组含指定sub_id的记录
PostgreSQL 查找JSONB数组包含指定值的条目
你的原查询存在几个问题:
c.configs->'pos_link'返回的是JSON对象而非数组,用jsonb_array_elements解析会直接报错- WHERE子句里的
sub_id和别名sub_ids不匹配 - 即使修正别名,原写法会将数组元素拆分为多行返回,导致结果重复
下面是几种正确的实现方式:
方法1:使用JSONB包含操作符@>(推荐,性能最优)
这是最简洁高效的写法,适合给configs列创建GIN索引的场景:
SELECT * FROM clients WHERE configs->'pos_link'->'sub_ids' @> '["00124"]'::jsonb;
@>操作符会直接检查左侧的JSONB数组是否包含右侧的单元素数组,无需展开数组,执行效率最高。
方法2:展开数组后过滤(适合需处理数组元素的场景)
如果需要同时对数组元素做额外处理,可以展开数组后匹配,用DISTINCT避免结果重复:
SELECT DISTINCT c.* FROM clients c JOIN jsonb_array_elements(c.configs->'pos_link'->'sub_ids') AS sub_id ON sub_id = '"00124"'::jsonb;
方法3:使用jsonb_exists函数
用专门的数组存在性检查函数,语义更直观:
SELECT * FROM clients WHERE jsonb_exists(configs->'pos_link'->'sub_ids', '00124');
内容的提问来源于stack exchange,提问作者Caldera500
相关产品推荐
相关产品推荐

