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

PostgreSQL 14中JSONB_PATH_QUERY嵌套JSON多条件查询异常求助

PostgreSQL 14 JSONB_PATH_QUERY嵌套数组多条件匹配正确写法

你的问题出在条件判断的逻辑上:当前查询里的@.child.key == "1000"和@.child.name == "B"是分别检查child数组中的元素——只要数组里存在某个元素的key是1000,同时存在另一个元素的name是B,条件就会成立,这就是为什么不符合预期的结果被返回了。

要实现同一个子对象同时满足多个条件的匹配,需要用exists函数对子数组的单个元素进行整体判断,正确的SQL写法如下:

无匹配的查询(符合你预期的无结果场景)

select jsonb_path_query(
    '[{"parent":"test","child":[{"key":"1000","name":"A"},{"key":"1001","name":"B"}]}]',
    '$[*] ? (@.parent == "test" && exists(@.child[*] ? (@.key == "1000" && @.name == "B")))'
);

这个查询会返回空结果,因为child数组中没有任何一个子对象同时满足key=1000和name=B。

符合预期的匹配查询

如果要匹配存在子对象key=1000且name=A,或者key=1001且name=B的父对象,可以这样写:

select jsonb_path_query(
    '[{"parent":"test","child":[{"key":"1000","name":"A"},{"key":"1001","name":"B"}]}]',
    '$[*] ? (
        @.parent == "test" && 
        (exists(@.child[*] ? (@.key == "1000" && @.name == "A")) || exists(@.child[*] ? (@.key == "1001" && @.name == "B")))
    )'
);

此查询会返回你提供的父对象,因为child数组中存在符合条件的子对象。

核心逻辑:通过exists(@.child[*] ? (...))确保我们的多条件是针对同一个子对象进行判断,而不是分别匹配数组中的不同元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:05:02