sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres jsonb-sökning i array med större operator (med jsonb_array_elements)

Istället för cross join lateral använd 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;

Uppdatera

Och ännu en metod, mer komplex men också mycket effektivare.

Skapa funktion som returnerar maxvärde från din JSONB data, så här:

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

Skapa index för denna funktion:

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

Använd funktionen i din fråga:

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

I det här fallet kommer indexet att användas och frågan kommer att gå mycket snabbare på stora mängder data.

PS:Vanligtvis limit har mening i par med order by .



  1. vad är oracle EBS R12

  2. mysql, transponera/pivotera rad till kolumn, variabelval

  3. Hur använder jag LINQ korrekt med MySQL?

  4. Kan ett JOBB skapas dynamiskt i en trigger?