Search Postgresql Archives

Re: ​jsonb @@ jsonpath operator doc: ​Only the first item of the result is taken into account

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 4/2/23 06:21, Erik Wienhold wrote:
On 01/04/2023 08:02 CEST jian he <jian.universality@xxxxxxxxx> wrote:

Hi,
https://www.postgresql.org/docs/current/functions-json.html
jsonb @@ jsonpath → boolean
Returns the result of a JSON path predicate check for the specified JSON
value. Only the first item of the result is taken into account. If the
result is not Boolean, then NULL is returned.
'{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' → t

select jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*]');
return

jsonb_path_query
------------------
  1
  2
  3
  4
  5
(5 rows)

I don't understand:"Only the first item of the result is taken into account.".

Here,JSON path predicate check for the specified JSON valuereturn true, some
return false. (1 > 2 is false, 2 > 2 is false).

The result is true if any array element matches the predicate because predicates
are evaluated on sequences.  The documentation for executePredicate in
src/backend/utils/adt/jsonpath_exec.c explains it:

Predicates have existence semantics, because their operands are item
sequences.  Pairs of items from the left and right operand's sequences are
checked.  TRUE returned only if any pair satisfying the condition is found.
In strict mode, even if the desired pair has already been found, all pairs
still need to be examined to check the absence of errors.  If any error
occurs, UNKNOWN (analogous to SQL NULL) is returned.

https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/utils/adt/jsonpath_exec.c;h=b561f0e7e803f0e5a546ad118a47f625225b9708;hb=HEAD#l1461

Difference between using a predicate as path expression vs filter expression:

	=# select jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*] > 2');
	 jsonb_path_query
	------------------
	 true
	(1 row)

	=# select jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ > 2)');
	 jsonb_path_query
	------------------
	 3
	 4
	 5
	(3 rows)

If you want the predicate result for each element, you must apply the predicate
to the rows returned from jsonb_path_query:

	=# select elem, elem::float > 2 as pred from jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*]') elem;
	 elem | pred
	------+------
	 1    | f
	 2    | f
	 3    | t
	 4    | t
	 5    | t
	(5 rows)

That is a long way from:

jsonb @@ jsonpath → boolean

Returns the result of a JSON path predicate check for the specified JSON value. Only the first item of the result is taken into account. If the result is not Boolean, then NULL is returned.



--
Erik



--
Adrian Klaver
adrian.klaver@xxxxxxxxxxx






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux