Fattigmands løsning
Hvis du er i stand til at oprette en funktion, kan du bruge denne. Jeg kompilerede listen med start her og tilføjet det over tid. Den er ret komplet. Du vil måske endda fjerne nogle tegn:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Din forespørgsel burde fungere sådan:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
For venstreforankrede søgninger kan du bruge et indeks på funktionen for meget hurtige resultater:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
For forespørgsler som:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Korrekt løsning
I PostgreSQL 9.1+ , med de nødvendige privilegier, kan du bare:
CREATE EXTENSION unaccent;
som giver en funktion unaccent()
, gør hvad du har brug for (undtagen lower()
, bare brug det yderligere, hvis det er nødvendigt). Læs manualen om denne udvidelse
.
Også tilgængelig til PostgreSQL 9.0 men CREATE EXTENSION
syntaks er nyt i 9.1.
Mere om unaccent og indekser: