jsonb
में कोई बिल्ट इन नहीं है ऑपरेटरों और न ही इस तरह के फ़िल्टर का समर्थन करने वाले किसी भी इंडेक्स को सीधे (अभी तक)।
मेरा सुझाव है कि EXISTS
सेमी-जॉइन:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
यह अनावश्यक मूल्यांकन और अंतिम DISTINCT
. से बचा जाता है चरण आपको एक सादे क्रॉस जॉइन
के साथ अलग-अलग पंक्तियां प्राप्त करने की आवश्यकता होगी ।
यदि यह अभी भी पर्याप्त तेज़ नहीं है, तो दिए गए प्रकार की क्वेरी के लिए एक अधिक परिष्कृत विशेष समाधान यह होगा कि एक <में प्रति पंक्ति अद्वितीय मानों (एक सीमांकक के साथ जो आपके खोज पैटर्न में हस्तक्षेप नहीं करेगा) की एक संयोजित स्ट्रिंग को निकालना होगा। कोड>अपरिवर्तनीय फंक्शन, फंक्शनल एक्सप्रेशन पर एक ट्रिग्राम GIN इंडेक्स बनाएं और अपने प्रश्नों में उसी एक्सप्रेशन का उपयोग करें।
संबंधित:
- अधिक ऑपरेटर के साथ jsonb सरणी में नेस्टेड मानों की खोज करें
- रिकॉर्ड्स की JSONB सरणी में एक कुंजी वाली पंक्तियां ढूंढें
- ऐरे सब-ऑब्जेक्ट पर पोस्टग्रेज JSONB इंडेक्स बनाएं
इसके अलावा, यदि आपका jsonb
मान वास्तव में उदाहरण की तरह दिखते हैं, आप बहुत सारे शोर को ट्रिम कर सकते हैं और बस स्टोर कर सकते हैं:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]