sql >> Database >  >> RDS >> PostgreSQL

Postgres jsonb zoeken in array met grotere operator (met jsonb_array_elements)

In plaats van cross join lateral gebruik 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;

Bijwerken

En nog een andere methode, complexer maar ook veel efficiënter.

Maak een functie die de maximale waarde retourneert van uw JSONB gegevens, zoals deze:

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

Maak een index op deze functie:

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

Gebruik de functie in uw zoekopdracht:

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

In dit geval zal de index worden gebruikt en zal de zoekopdracht veel sneller zijn op grote hoeveelheden gegevens.

PS:Meestal limit heb zin in combinatie met order by .



  1. Hoe kom je er met behulp van sql/plsql achter welke tekenset een tekst gebruikt?

  2. dblink gebruikt het .pgpass-bestand niet

  3. Django MySQL volledige tekst zoeken

  4. Op Oracle functie gebaseerde indexen