sql >> Databáze >  >> RDS >> PostgreSQL

Postgres jsonb vyhledávání v poli s větším operátorem (s jsonb_array_elements)

Místo cross join lateral použijte 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;

Aktualizovat

A ještě další metoda, složitější, ale také mnohem účinnější.

Vytvořte funkci, která vrátí maximální hodnotu z vašeho JSONB data, jako je tento:

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

Vytvořit index pro tuto funkci:

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

Použijte funkci ve svém dotazu:

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

V tomto případě bude použit index a dotaz bude mnohem rychlejší na velké množství dat.

PS:Obvykle limit mít smysl v páru s order by .



  1. mysql spojuje tabulky a vytváří chybějící data

  2. Úloha pro mysqld.service se nezdařila Viz systemctl status mysqld.service

  3. Jak přetypovat z textu na int, pokud sloupec obsahuje hodnoty int i NULL v PostgreSQL

  4. COUNT (DISTINCT column_name) Nesrovnalosti vs. COUNT (column_name) v SQL Server 2008?