संक्षिप्त उत्तर
आप फ़ंक्शन का उपयोग कर सकते हैं 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)
समारोह के मामले में यह संभव नहीं है। अनुक्रमणिका द्वारा समर्थित क्वेरी फ़ंक्शन का उपयोग करने वालों की तुलना में कई दर्जन गुना तेज हो सकती हैं।