SELECT *
FROM posts p
WHERE EXISTS (
SELECT FROM jsonb_array_elements_text(p.tags) tag
WHERE tag LIKE '%TAG%'
);
संबंधित, स्पष्टीकरण के साथ:
- किसी पैटर्न से मेल खाने वाले मान वाले ऑब्जेक्ट के लिए JSON सरणी खोजें
या @?
. के साथ आसान पोस्टग्रेज 12 के बाद से ऑपरेटर ने SQL/JSON को लागू किया:
SELECT *
-- optional to show the matching item:
-- , jsonb_path_query_first(tags, '$[*] ? (@ like_regex "^ tag" flag "i")')
FROM posts
WHERE tags @? '$[*] ? (@ like_regex "TAG")';
ऑपरेटर @?
फ़ंक्शन के चारों ओर केवल एक आवरण है jsonb_path_exists()
. तो यह बराबर है:
...
WHERE jsonb_path_exists(tags, '$[*] ? (@ like_regex "TAG")');
न तो सूचकांक समर्थन है। (@?
. के लिए जोड़ा जा सकता है ऑपरेटर बाद में, लेकिन अभी तक पीजी 13 में नहीं है)। तो वे प्रश्न बड़ी तालिकाओं के लिए धीमे हैं। एक सामान्यीकृत डिज़ाइन, जैसा कि लॉरेन्ज़ ने पहले ही सुझाया था, बेहतर होगा - एक ट्रिग्राम इंडेक्स के साथ:
- PostgreSQL क्वेरी प्रदर्शन विविधताओं की तरह
केवल उपसर्ग मिलान . के लिए (LIKE 'TAG%'
, कोई अग्रणी वाइल्डकार्ड नहीं), आप इसे पूर्ण पाठ अनुक्रमणिका . के साथ काम कर सकते हैं :
CREATE INDEX posts_tags_fts_gin_idx ON posts USING GIN (to_tsvector('simple', tags));
और एक मेल खाने वाली क्वेरी:
SELECT *
FROM posts p
WHERE to_tsvector('simple', tags) @@ 'TAG:*'::tsquery
या english
का उपयोग करें simple
. के बजाय शब्दकोश (या जो भी आपके मामले में फिट बैठता है) यदि आप प्राकृतिक अंग्रेजी भाषा के लिए स्टेम करना चाहते हैं।
to_tsvector(json(b))
आवश्यकता है 10 पोस्ट करें या बाद में।
संबंधित:
- GIN अनुक्रमित TSVECTOR कॉलम से आंशिक मिलान प्राप्त करें
- PostgreSQL में LIKE, SIMILAR TO या रेगुलर एक्सप्रेशन से मिलान करने वाला पैटर्न