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;
इस मामले में सूचकांक का उपयोग किया जाएगा और बड़ी मात्रा में डेटा पर क्वेरी बहुत तेज हो जाएगी।
पुनश्च:आमतौर पर limit
order by
. के साथ जोड़ी में समझ है ।