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
相关产品推荐
相关产品推荐

