sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres accentufølsomme LIKE-søgning i Rails 3.1 på Heroku

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:



  1. FEJL:funktioner i indeksudtryk skal markeres IMMUTABEL i Postgres

  2. zsh:kommando ikke fundet:mysql

  3. Eksporterer tabel til CSV via php-knap

  4. Indsætter du flere rækker i en enkelt SQL-forespørgsel?