PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अधिक ऑपरेटर (jsonb_array_elements के साथ) के साथ सरणी में jsonb खोज को पोस्टग्रेज करता है

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 . के साथ जोड़ी में समझ है ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Npgsql - निर्दिष्ट विधि समर्थित नहीं है

  2. मैं Postgres में किसी तालिका को कैसे बदलूँ?

  3. Psycopg2 INSERT को लूप में चलने में इतना समय क्यों लग रहा है और मैं इसे कैसे गति दूं?

  4. फेडोरा 33 . पर PostgreSQL 12 कैसे स्थापित करें

  5. Postgresql CASE स्टेटमेंट - क्या मैं अपने SELECT में CASE के रिटर्न वैल्यू का उपयोग कर सकता हूं?