Вместо 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
.