PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Pesquisa jsonb do Postgres em array com operador maior (com jsonb_array_elements)


Em vez de cross join lateral use 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;

Atualizar

E ainda outro método, mais complexo, mas também muito mais eficiente.

Crie uma função que retorne o valor máximo do seu JSONB dados, assim:
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 $$

Crie um índice nesta função:
create index idx_max_PAYABLE_INVOICE_LINES_value
  on documents(fn_get_max_PAYABLE_INVOICE_LINES_value(data_block));

Use a função em sua consulta:
select *
from documents d
where fn_get_max_PAYABLE_INVOICE_LINES_value(data_block) > 1000
limit 50;

Nesse caso, o índice será usado e a consulta será muito mais rápida em grande quantidade de dados.

PS:Normalmente limit tem sentido em par com order by .