sql >> Database >  >> RDS >> PostgreSQL

Postgres accent ongevoelig LIKE zoeken in Rails 3.1 op Heroku

Arme man's oplossing

Als u een functie kunt maken, kunt u deze gebruiken. Ik heb de lijst samengesteld vanaf hier en er in de loop van de tijd aan toegevoegd. Het is vrij compleet. Misschien wilt u zelfs enkele tekens verwijderen:

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

Uw zoekopdracht zou zo moeten werken:

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

Voor links-verankerde zoekopdrachten kunt u een index op de functie gebruiken voor zeer snelle resultaten:

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

Voor vragen als:

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

Goede oplossing

In PostgreSQL 9.1+ , met de nodige privileges, kunt u gewoon:

CREATE EXTENSION unaccent;

die een functie biedt unaccent() , doen wat je nodig hebt (behalve lower() , gebruik dat gewoon extra als dat nodig is). Lees de handleiding over deze extensie .
Ook beschikbaar voor PostgreSQL 9.0 maar CREATE EXTENSION syntaxis is nieuw in 9.1.

Meer over unaccent en indexen:



  1. Normalisatie maakt joins over meerdere tabellen moeilijk

  2. MySQL's ORDER BY FIELD() simuleren in Postgresql

  3. Hoe maak je een Datetime Format in SQLite

  4. Breek de muren af! Hoe u uw gegevens kunt verwijderen