PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres jsonb търсене в масив с по-голям оператор (с jsonb_array_elements)

Вместо cross join lateral използвайте 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;

Актуализация

И още един метод, по-сложен, но и много по-ефективен.

Създайте функция, която връща максимална стойност от вашия JSONB данни, като това:

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

Създайте индекс на тази функция:

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

Използвайте функция във вашата заявка:

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

В този случай ще се използва индексът и заявката ще бъде много по-бърза при голямо количество данни.

PS:Обикновено limit имат смисъл в двойка с 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. Проследяване на висока наличност за PostgreSQL със сърдечен ритъм

  2. [Видео] Ansible и PostgreSQL

  3. Актуализирайте поръчката за връщане от в postgresql

  4. Масивът TypeORM не се поддържа в postgres?

  5. Как да индексирам postgres таблица по име, когато името може да бъде на всеки език?