You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:10:19