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

IN ऑपरेटर के साथ jsonb सरणियों को कैसे क्वेरी करें

संक्षिप्त उत्तर

आप फ़ंक्शन का उपयोग कर सकते हैं jsonb_array_elements() एक पार्श्व में शामिल हों और इसके परिणाम का उपयोग करें value WHERE . में जटिल भावों में खंड:

SELECT t.* 
FROM test t
CROSS JOIN jsonb_array_elements(test_content)
WHERE value->>'label' IN ('b', 'd')
AND value->>'label1' IN ('2', '3')

विशिष्ट

जब एक पंक्ति में सरणी के एक से अधिक तत्वों में फ़िल्टर शर्तें पूरी होती हैं, तो क्वेरी डुप्लिकेट पंक्तियों को वापस कर सकती है, उदा.

SELECT t.* 
FROM test t
CROSS JOIN jsonb_array_elements(test_content)
WHERE value->>'label' IN ('a', 'b')

                  id                  |                          test_content                          
--------------------------------------+----------------------------------------------------------------
 aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | [{"label": "a", "label1": "1"}, {"label": "b", "label1": "2"}]
 aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | [{"label": "a", "label1": "1"}, {"label": "b", "label1": "2"}]
(2 rows)    

इसलिए DISTINCT . का उपयोग करना उचित हो सकता है SELECT . में सूची:

SELECT DISTINCT t.* 
FROM test t
CROSS JOIN jsonb_array_elements(test_content)
WHERE value->>'label' IN ('a', 'b')

या EXISTS WHERE . में क्लॉज, जो थोड़ा तेज हो सकता है:

SELECT t.*
FROM test t
WHERE EXISTS (
    SELECT 
    FROM jsonb_array_elements(test_content)
    WHERE value->>'label' IN ('a', 'b')
    )

आप उन मामलों में मिलान करने वाले सरणी तत्वों का चयन भी कर सकते हैं जहां इस जानकारी की आवश्यकता होती है:

SELECT id, value
FROM test t
CROSS JOIN jsonb_array_elements(test_content)
WHERE value->>'label' IN ('a', 'b')

                  id                  |             value             
--------------------------------------+-------------------------------
 aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | {"label": "a", "label1": "1"}
 aa82a8b8-33ef-4937-bd8c-8a4b40960f18 | {"label": "b", "label1": "2"}
(2 rows)

प्रदर्शन

jsonb_array_elements() समारोह महंगा है। बड़ी तालिकाओं के लिए भारी सर्वर लोड और क्वेरी के लंबे निष्पादन समय के कारण फ़ंक्शन का उपयोग संदिग्ध हो सकता है।

जबकि @> . के साथ प्रश्नों के लिए GIN अनुक्रमणिका का उपयोग किया जा सकता है ऑपरेटर:

CREATE INDEX ON test USING GIN (test_content)

समारोह के मामले में यह संभव नहीं है। अनुक्रमणिका द्वारा समर्थित क्वेरी फ़ंक्शन का उपयोग करने वालों की तुलना में कई दर्जन गुना तेज हो सकती हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अभी () फ़ंक्शन से घंटे घटाएं

  2. PostgreSQL में Oracle उच्च उपलब्धता अवधारणाएं

  3. PostgreSQL13 में अपग्रेड करना

  4. Postgres - 2 ARRAYs के प्रतिच्छेदन को वापस करने का कार्य?

  5. विचारों में प्रयुक्त PostgreSQL कॉलम बदलें