Ubohé řešení
Pokud jste schopni vytvořit funkci, můžete použít tuto. Sestavil jsem seznam počínaje zde a časem se k tomu přidal. Je docela kompletní. Můžete dokonce chtít odstranit některé znaky:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Váš dotaz by měl fungovat takto:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Pro vyhledávání ukotvená vlevo můžete využít index na funkci pro velmi rychlé výsledky:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Pro dotazy typu:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Správné řešení
V PostgreSQL 9.1+ , s nezbytnými oprávněními můžete:
CREATE EXTENSION unaccent;
která poskytuje funkci unaccent()
, dělá to, co potřebujete (kromě lower()
, v případě potřeby jej použijte dodatečně). Přečtěte si příručku o tomto rozšíření
.
K dispozici také pro PostgreSQL 9.0 ale CREATE EXTENSION
syntaxe je nová ve verzi 9.1.
Více o bezpřízvuku a indexech: