PostgreSQL中jsonb_path判断info.id包含于指定数组的正确查询语句
正确SQL查询方案
针对你的需求,这里提供几种可行的查询方式,同时说明原语句的问题所在:
方法1:展开JSON数组后筛选(最直观)
通过jsonb_array_elements将info字段的JSON数组展开为行,再检查是否存在符合条件的id,最后通过EXISTS判断:
SELECT u.* FROM users u WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements(u.info) elem WHERE elem->>'id' = ANY('["first"]'::text[]) );
如果需要匹配多个id(比如["first", "second"]),直接修改数组参数即可,ANY会自动匹配其中任意一个值。
方法2:使用jsonb_path_exists的正确路径
原语句的问题在于路径错误:info是JSON数组,而非单个JSON对象,需要用$[*]遍历数组中的所有元素,再定位到id属性。正确写法如下:
-- 匹配单个id SELECT * FROM users WHERE jsonb_path_exists(info, '$[*].id ? (@ == $target)', '{"target": "first"}'); -- 匹配多个id中的任意一个 SELECT * FROM users WHERE jsonb_path_exists(info, '$[*].id ? (@ in $target)', '{"target": ["first", "second"]}');
方法3:使用jsonb_contains(适合单值匹配)
如果仅需匹配单个id,可以直接用@>运算符判断JSON数组是否包含指定的对象:
SELECT * FROM users WHERE info @> '[{"id": "first"}]';
内容的提问来源于stack exchange,提问作者platypus
相关产品推荐
相关产品推荐

