unaccent()
का अपरिवर्तनीय संस्करण
वर्तमान में स्वीकृत, गलत उत्तर
में गलत सूचना को स्पष्ट करने के लिए :
अभिव्यक्ति अनुक्रमणिका केवल IMMUTABLE
की अनुमति देती है फ़ंक्शन (स्पष्ट कारणों से) और unaccent()
केवल STABLE
है . टिप्पणी में आपके द्वारा सुझाए गए समाधान समस्याग्रस्त भी है। विस्तृत व्याख्या और एक उचित समाधान उसके लिए :
tags->name
. की सामग्री के आधार पर unaccent()
जोड़ना उपयोगी हो सकता है अभिव्यक्ति सूचकांक के लिए, लेकिन यह प्रश्न के लिए ऑर्थोगोनल है कि सूचकांक का उपयोग क्यों नहीं किया जा रहा था:
वास्तविक समस्या / समाधान
ऑपरेटर LIKE
आपकी क्वेरी में संक्षेप में गलत है (सबसे अधिक संभावना)। आप नहीं करते हैं खोज पैटर्न के रूप में 'वेस्टस्ट्रैस' की व्याख्या करना चाहते हैं, आप (सामान्यीकृत) स्ट्रिंग से मेल खाना चाहते हैं। =
. से बदलें ऑपरेटर, और आप अपनी वर्तमान अनुक्रमणिका के साथ एक (बिटमैप) अनुक्रमणिका स्कैन देखेंगे, चाहे unaccent()
. के फंक्शन वोलैटिलिटी के बारे में :
SELECT * FROM germany.ways
WHERE lower(tags->'name') = lower(unaccent('unaccent','Weststrasse'))
क्यों?
LIKE
. का दायां संकार्य एक पैटर्न है . पोस्टग्रेज पैटर्न मिलान के लिए एक सादे बीट्री इंडेक्स का उपयोग नहीं कर सकते हैं ( अपवाद लागू होते हैं
) एक LIKE
पैटर्न के रूप में एक सादे स्ट्रिंग के साथ (कोई विशेष वर्ण नहीं) btree अनुक्रमणिका पर समानता जांच के साथ अनुकूलित किया जा सकता है। लेकिन अगर स्ट्रिंग में विशेष वर्ण हैं, तो यह अनुक्रमणिका समाप्त हो गई है।
अगर कोई IMMUTABLE
है LIKE
. के दाईं ओर कार्य करें , इसका तुरंत मूल्यांकन किया जा सकता है और उक्त अनुकूलन अभी भी संभव है। प्रति दस्तावेज़ीकरण कार्य अस्थिरता श्रेणियों पर
:
कम फंक्शन वोलैटिलिटी के साथ यह संभव नहीं है (STABLE
या VOLATILE
) इसलिए एक IMMUTABLE unaccent()
को नकली बनाने का आपका "समाधान" काम करने लगा, लेकिन यह वास्तव में एक सुअर पर लिपस्टिक लगा रहा है।
दोहराने के लिए:
- अगर आप
LIKE
के साथ काम करना चाहते हैं और पैटर्न, ट्रिग्राम इंडेक्स<का उपयोग करें /मजबूत> । - अगर आप
LIKE
के साथ काम नहीं करना चाहते हैं और पैटर्न, समानता ऑपरेटर=
. का उपयोग करें