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

Unaccent () Postgres में अनुक्रमणिका उपयोग को रोकना

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() को नकली बनाने का आपका "समाधान" काम करने लगा, लेकिन यह वास्तव में एक सुअर पर लिपस्टिक लगा रहा है।

दोहराने के लिए:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. समूह का उपयोग करते समय npgsql डेटा प्रकार अज्ञात

  2. PostgreSQL GeoJSON <- php -> JavaScript

  3. PostgreSQL, दो पंक्तियों में कुछ कॉलम का डेटा स्वैप करें

  4. c3p0 के साथ हाइबरनेट:createClob () अभी तक लागू नहीं किया गया है

  5. क्वेरी आउटपुट से प्रारंभ और समाप्ति टाइमस्टैम्प के साथ आंशिक रूप से/पूरी तरह से ओवरलैपिंग ईवेंट कैसे निकालें?