PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyszukiwanie jsonb Postgres w tablicy z większym operatorem (z jsonb_array_elements)

Zamiast cross join lateral użyj 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;

Aktualizacja

I jeszcze jedna metoda, bardziej złożona, ale także znacznie wydajniejsza.

Utwórz funkcję, która zwraca maksymalną wartość z Twojego JSONB dane, takie jak:

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

Utwórz indeks dla tej funkcji:

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

Użyj funkcji w zapytaniu:

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

W takim przypadku zostanie użyty indeks, a zapytanie będzie znacznie szybsze na dużej ilości danych.

PS:Zwykle limit mieć sens w parze z order by .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć zduplikowane wiersze bez unikalnego identyfikatora

  2. Distinct Records ze złączeniami i porządkiem

  3. Django nie może załadować testowych urządzeń, IntegrityError

  4. Po przywróceniu PostgreSQL otrzymuję odmowę uprawnień dla relacji django_session

  5. Dzielenie PostgreSQL przez zero przy zamówieniu