उत्तर अब तक आपके प्रश्न का समाधान करने में विफल हैं:
इससे कोई फर्क नहीं पड़ता कि आप LIKE
. का उपयोग करते हैं या नहीं या =
जब तक आप पूरी स्ट्रिंग से मेल खाते हैं (और कोई वाइल्डकार्ड वर्ण नहीं हैं में आपकी स्ट्रिंग)। खोज को अस्पष्ट बनाने के लिए, आपको प्रतिस्थापित करना होगा पैटर्न का हिस्सा, न कि केवल उसमें जोड़ें।
उदाहरण के लिए, subcolumn
. के अंतिम 7 (8 के बजाय) वर्णों से मिलान करने के लिए :
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
मैं सरल left()
का उपयोग करता हूं (पोस्टग्रेज 9.1 के साथ पेश किया गया)।
आप could
इसे सरल करें:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
लेकिन आप नहीं करेंगे यदि आप उस विशेष अनुक्रमणिका का उपयोग करते हैं जिसका मैंने आगे उल्लेख किया है, क्योंकि कार्यात्मक अनुक्रमणिका में अभिव्यक्तियों का उपयोग करने के लिए सटीक रूप से मिलान करना होता है।
आपको एक्सटेंशन pg_tgrm
में दिलचस्पी हो सकती है
।
PostgreSQL 9.1 में प्रति डेटाबेस एक बार चलाएं:
CREATE EXTENSION pg_tgrm;
दो कारण:
-
यह समानता ऑपरेटर
%
. इसके साथ आप एक स्मार्ट समानता खोज बना सकते हैं:--SELECT show_limit(); SELECT set_limit(0.5); -- adjust similarity limit for % operator SELECT * FROM maintable m WHERE left(maincolumn, 8) % (SELECT subcolumn FROM subtable WHERE subid = 2);
-
यह इंडेक्स सपोर्ट की आपूर्ति करता है दोनों के लिए
LIKE
और%
अगर पठन प्रदर्शन लेखन प्रदर्शन से अधिक महत्वपूर्ण है, तो मेरा सुझाव है कि आप एक बनाएं। कार्यात्मक इस तरह GIN या GiST इंडेक्स:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
यह अनुक्रमणिका किसी भी क्वेरी का समर्थन करती है। ध्यान रखें कि यह लिखने के संचालन के लिए कुछ लागत के साथ आता है।
इसी तरह के मामले के लिए एक त्वरित बेंचमार्क इस संबंधित उत्तर में ।