PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Recherche LIKE insensible aux accents Postgres dans Rails 3.1 sur Heroku

La solution du pauvre

Si vous êtes capable de créer une fonction, vous pouvez utiliser celle-ci. J'ai compilé la liste en commençant ici et s'y ajoute au fil du temps. C'est assez complet. Vous pouvez même supprimer certains caractères :

CREATE OR REPLACE FUNCTION lower_unaccent(text)
  RETURNS text AS
$func$
SELECT lower(translate($1
     , '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
     , '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
     ));
$func$ LANGUAGE sql IMMUTABLE;

Votre requête devrait fonctionner comme ça :

find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])

Pour les recherches ancrées à gauche, vous pouvez utiliser un index sur la fonction pour très résultats rapides :

CREATE INDEX tbl_name_lower_unaccent_idx
  ON fest (lower_unaccent(name) text_pattern_ops);

Pour des requêtes telles que :

SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'

Solution appropriée

Dans PostgreSQL 9.1+ , avec les privilèges nécessaires, vous pouvez simplement :

CREATE EXTENSION unaccent;

qui fournit une fonction unaccent() , en faisant ce dont vous avez besoin (sauf pour lower() , utilisez-le simplement en plus si nécessaire). Lisez le manuel sur cette extension .
Également disponible pour PostgreSQL 9.0 mais CREATE EXTENSION la syntaxe est nouvelle dans la version 9.1.

En savoir plus sur l'absence d'accent et les index :