गरीबों का समाधान
यदि आप कोई फ़ंक्शन बनाने में सक्षम हैं, तो आप इसका उपयोग कर सकते हैं। मैंने सूची को यहां से संकलित किया है। और समय के साथ इसमें जोड़ा गया। यह काफी पूर्ण है। आप कुछ वर्णों को हटाना भी चाह सकते हैं:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
आपकी क्वेरी इस तरह काम करनी चाहिए:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
बाएं-एंकर वाली खोजों के लिए, आप फ़ंक्शन पर बहुत . के लिए एक अनुक्रमणिका का उपयोग कर सकते हैं तेज़ परिणाम:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
जैसे प्रश्नों के लिए:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
उचित समाधान
PostgreSQL 9.1+ . में , आवश्यक विशेषाधिकारों के साथ, आप बस कर सकते हैं:
CREATE EXTENSION unaccent;
जो एक फ़ंक्शन प्रदान करता है unaccent()
, आपको जो चाहिए वह करना (lower()
. को छोड़कर , बस जरूरत पड़ने पर इसका अतिरिक्त उपयोग करें)। इस एक्सटेंशन के बारे में मैनुअल
पढ़ें .
PostgreSQL 9.0 के लिए भी उपलब्ध है लेकिन CREATE EXTENSION
सिंटेक्स 9.1 में नया है।
उच्चारण और अनुक्रमणिका के बारे में अधिक जानकारी: