Die Lösung des armen Mannes
Wenn Sie eine Funktion erstellen können, können Sie diese verwenden. Ich habe die Liste ab hier zusammengestellt und im Laufe der Zeit ergänzt. Es ist ziemlich vollständig. Vielleicht möchten Sie sogar einige Zeichen entfernen:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Ihre Abfrage sollte folgendermaßen funktionieren:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Für links verankerte Suchen können Sie einen Index für die Funktion sehr verwenden schnelle Ergebnisse:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Für Abfragen wie:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Richtige Lösung
In PostgreSQL 9.1+ , mit den erforderlichen Berechtigungen können Sie einfach:
CREATE EXTENSION unaccent;
die eine Funktion unaccent()
bereitstellt , tun, was Sie brauchen (außer lower()
). , verwenden Sie das einfach bei Bedarf zusätzlich). Lesen Sie das Handbuch zu dieser Erweiterung
.
Auch verfügbar für PostgreSQL 9.0 aber CREATE EXTENSION
Syntax ist neu in 9.1.
Mehr über Akzent und Indizes: