Rozwiązanie biednego człowieka
Jeśli jesteś w stanie stworzyć funkcję, możesz użyć tej. Skompilowałem listę zaczynając tutaj i dodawane z czasem. Jest całkiem kompletny. Możesz nawet usunąć niektóre znaki:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Twoje zapytanie powinno działać tak:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
W przypadku wyszukiwań zakotwiczonych z lewej strony możesz użyć indeksu funkcji bardzo szybkie wyniki:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
W przypadku zapytań takich jak:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Właściwe rozwiązanie
W PostgreSQL 9.1+ , mając niezbędne uprawnienia, możesz po prostu:
CREATE EXTENSION unaccent;
która udostępnia funkcję unaccent()
, robiąc to, czego potrzebujesz (z wyjątkiem lower()
, po prostu użyj tego dodatkowo w razie potrzeby). Przeczytaj podręcznik dotyczący tego rozszerzenia
.
Dostępne również dla PostgreSQL 9.0 ale CREATE EXTENSION
składnia jest nowa w wersji 9.1.
Więcej o nieakcentach i indeksach: