sql >> Base de Datos >  >> RDS >> PostgreSQL

Búsqueda de Postgres jsonb en matriz con mayor operador (con jsonb_array_elements)

En lugar de cross join lateral usa where exists :

select *
from documents d
where exists (
  select 1
  from jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil
  where (pil->'AMOUNT'->>'value')::decimal >= 1000)
limit 50;

Actualizar

Y otro método más, más complejo pero también mucho más eficaz.

Cree una función que devuelva el valor máximo de su JSONB datos, así:

create function fn_get_max_PAYABLE_INVOICE_LINES_value(JSONB) returns decimal language sql as $$
  select max((pil->'AMOUNT'->>'value')::decimal)
  from jsonb_array_elements($1 -> 'PAYABLE_INVOICE_LINES') as pil $$

Crear índice en esta función:

create index idx_max_PAYABLE_INVOICE_LINES_value
  on documents(fn_get_max_PAYABLE_INVOICE_LINES_value(data_block));

Use la función en su consulta:

select *
from documents d
where fn_get_max_PAYABLE_INVOICE_LINES_value(data_block) > 1000
limit 50;

En este caso, se usará el índice y la consulta será mucho más rápida en una gran cantidad de datos.

PD:Normalmente limit tiene sentido en pareja con order by .