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

PostgreSQL 9.6.24中JSONB列嵌套数组的状态匹配查询问题

PostgreSQL jsonb嵌套数组查询解决方案

你的查询未返回结果的核心原因是JSON路径错误:metas数组并非直接位于顶层metadata对象下,而是嵌套在items数组元素的metadata字段内,原SQL直接读取metadata->'metas'会得到null,因此无法匹配数据。

以下是两种适配PostgreSQL 9.6.24的解决方案:

方案一:匹配metas数组中任意符合条件的status

通过两次数组展开(先展开items,再展开每个item下的metas),筛选出任意metas元素status为active或reported的记录:

SELECT b.*
FROM blobs b
WHERE b.metadata IS NOT NULL
AND EXISTS (
    SELECT 1
    FROM jsonb_array_elements(b.metadata->'items') AS items_arr
    CROSS JOIN jsonb_array_elements(items_arr->'metadata'->'metas') AS metas_arr
    WHERE metas_arr->>'status' IN ('active', 'reported')
);

方案二:仅匹配metas数组第一个元素的status

若只需检查每个item下metas数组的第一个元素,可直接通过JSON路径访问,无需展开整个数组:

检查任意item的第一个metas元素

SELECT *
FROM blobs
WHERE metadata IS NOT NULL
AND EXISTS (
    SELECT 1
    FROM jsonb_array_elements(metadata->'items') AS items_arr
    WHERE (items_arr->'metadata'->'metas'->0->>'status') IN ('active', 'reported')
);

仅检查第一个item的第一个metas元素

如果业务场景只关注items数组的第一个元素,可简化为:

SELECT *
FROM blobs
WHERE metadata IS NOT NULL
AND (metadata->'items'->0->'metadata'->'metas'->0->>'status') IN ('active', 'reported');

内容的提问来源于stack exchange,提问作者Irtaza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:35:19