On 06/13/24 16:43, David E. Wheeler wrote: > Paging Mr. Eisentraut! I'm not Mr. Eisentraut, but I have at last talked my way into some access to the standard, so ...
Note 487 emphasizes that JSON path predicates "are not expressions; instead they form a separate language that can only be invoked within a <JSON filter expression>". The only operators usable in a general expression (that is, a <JSON path wff> are binary + - and binary * / % and unary + - over a <JSON accessor expression>. Inside a filter, you get to use a <JSON path predicate>. That's where you can use ! and && and ||. But ! can only be applied to a <JSON delimited predicate>: either a <JSON exists path predicate>, or any other <JSON path predicate> wrapped in parentheses. On 06/13/24 11:32, David E. Wheeler wrote: > david=# select jsonb_path_query('true', '$ && $'); > david=# select jsonb_path_query('true', '$.boolean() && $.boolean()'); Those don't work because, as you recognized, they're not inside filters. > david=# select jsonb_path_query('[1, 3, 7]', '$[*] ? (@.boolean() && > @.boolean())'); That doesn't work because the operands of && or || must have the grammatical form of predicates; it's not enough that they be expressions of boolean type. '$[*] ? (@.boolean() == true && @.boolean() == true)' ought to work (though in any other context you'd probably call it a code smell!) because each operand is now a <JSON comparison predicate>. Regards, -Chap