sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres jsonb-søgning i array med større operator (med jsonb_array_elements)

I stedet for cross join lateral brug 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;

Opdater

Og endnu en metode, mere kompleks, men også meget mere effektiv.

Opret funktion, der returnerer max værdi fra din JSONB data, som denne:

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 $$

Opret indeks på denne funktion:

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

Brug funktionen i din forespørgsel:

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

I dette tilfælde vil indekset blive brugt, og forespørgslen vil være meget hurtigere på store mængder data.

PS:Normalt limit have fornuft i par med order by .



  1. Opret en DML Trigger i SQL Server

  2. Sådan slutter du dig til MySQL og Postgres i en live materialiseret visning

  3. MySQL:Indsæt flere rækker med samme AI-værdi

  4. RESTful Api eller Socket.IO