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

किसी पैटर्न से मेल खाने वाले मान वाले ऑब्जेक्ट के लिए JSON सरणी खोजें

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"}
]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql:कनेक्शन से इनकार कर दिया। जांचें कि होस्टनाम और पोर्ट सही हैं और पोस्टमास्टर टीसीपी/आईपी कनेक्शन स्वीकार कर रहा है

  2. पोस्टग्रेज इंस्टालेशन डेटाबेस क्लस्टर इनिशियलाइज़ेशन विफल (Postgresql संस्करण 9.4.4)

  3. पोस्टग्रेएसक्यूएल JSON कॉलम को हाइबरनेट इकाई संपत्ति में मैप करना

  4. INNER JOIN . के साथ कॉलम मानों की COUNT संख्या को पोस्टग्रेज करता है

  5. Postgres में बल्क इंसर्ट करने का सबसे तेज़ तरीका क्या है?