PostgreSQL 12下JSONB_PATH_EXISTS函数使用异常问题咨询
问题1:非strict(lax)模式下type()判断不生效的原因
PostgreSQL JSONPath的lax模式自动拆分数组的规则仅作用于路径遍历阶段,你将type()调用放在过滤器?()内部时,拆分逻辑已经先于过滤器执行完成:
- strict模式下,路径
$返回的是你传入的listtxt数组本身,过滤器仅执行1次,@指向数组对象,type()返回array,匹配成功。 - lax模式下,路径
$返回的数组会被自动拆分为多个元素传入过滤器,此时过滤器里的@指向的是"hello"、"how"这类字符串元素,type()返回string,自然无法匹配== "array"的条件,最终JSONB_PATH_EXISTS返回false。
如果要在lax模式下实现相同的数组类型判断,可以直接将type()放在路径表达式层级:
AND JSONB_PATH_EXISTS(json -> 'fields' -> 'listtxt', '$.type() == "array"')
问题2:嵌套数组条件语法错误的修复
你写法的问题是过滤器内部不能直接嵌套另一个?()过滤器,要判断数组中是否存在符合条件的元素,需要用exists()谓词包裹嵌套的路径判断:
AND JSONB_PATH_EXISTS(json -> 'fields' -> 'listtxt', 'strict $ ? (@.type() == "array" && exists(@[*] ? (@ == "how")))')
JSONPath语法要求&&两侧必须是布尔值,你之前写的@[*] ? (@ == "how")是路径表达式而非布尔值,用exists()包裹后会返回该路径是否有匹配结果的布尔值,符合语法要求。
内容的提问来源于stack exchange,提问作者codename44
相关产品推荐
相关产品推荐

