2012-11-28 14 views
15

Mögliche Duplizieren:
Does PostgreSQL support “accent insensitive” collations?Funktion entfernen Akzente in postgreSQL

Ich versuche, die Akzente zu entfernen, so, wenn ich ein machen SELECT es ignoriert sie.

Beispiel:

SELECT * FROM table WHERE 
table.id ILIKE 'Jose'; 

Es gibt:

José 
Jose 
Jósé 
Jóse 

oder so ähnlich.

Ich fand diese Funktionen und sie werden nicht funktionieren, ich denke, es könnte die Tatsache sein, dass ich Struts 1.X verwende, bitte überprüfen Sie sie und sagen Sie mir, wo ich falsch liege oder welche andere Funktion sollte ich benutzen.

erste Funktion

CREATE OR REPLACE FUNCTION unaccent_string(text) RETURNS text AS $$ 
DECLARE 
    input_string text := $1; 
BEGIN 

input_string := translate(input_string, 'âãäåāăąÁÂÃÄÅĀĂĄ', 'aaaaaaaaaaaaaaa'); 
input_string := translate(input_string, 'èééêëēĕėęěĒĔĖĘĚ', 'eeeeeeeeeeeeeee'); 
input_string := translate(input_string, 'ìíîïìĩīĭÌÍÎÏÌĨĪĬ', 'iiiiiiiiiiiiiiii'); 
input_string := translate(input_string, 'óôõöōŏőÒÓÔÕÖŌŎŐ', 'ooooooooooooooo'); 
input_string := translate(input_string, 'ùúûüũūŭůÙÚÛÜŨŪŬŮ', 'uuuuuuuuuuuuuuuu'); 

return input_string; 
END; 
$$ LANGUAGE plpgql; 

SECOND FUNCTION

CREATE OR REPLACE FUNCTION norm_text_latin(character varying) 
    RETURNS character varying AS 
$BODY$ 
declare 
     p_str alias for $1; 
     v_str varchar; 
begin 
     select translate(p_str, 'ÀÁÂÃÄÅ', 'AAAAAA') into v_str; 
     select translate(v_str, 'ÉÈËÊ', 'EEEE') into v_str; 
     select translate(v_str, 'ÌÍÎÏ', 'IIII') into v_str; 
     select translate(v_str, 'ÌÍÎÏ', 'IIII') into v_str; 
     select translate(v_str, 'ÒÓÔÕÖ', 'OOOOO') into v_str; 
     select translate(v_str, 'ÙÚÛÜ', 'UUUU') into v_str; 
     select translate(v_str, 'àáâãäå', 'aaaaaa') into v_str; 
     select translate(v_str, 'èéêë', 'eeee') into v_str; 
     select translate(v_str, 'ìíîï', 'iiii') into v_str; 
     select translate(v_str, 'òóôõö', 'ooooo') into v_str; 
     select translate(v_str, 'ùúûü', 'uuuu') into v_str; 
     select translate(v_str, 'Çç', 'Cc') into v_str; 
     return v_str; 
end;$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE; 

Beide Funktionen erzeugen den folgenden Fehler, wenn ich die Datei in NetBeans ausführen:

ERROR: unterminated dollar-quoted string at or near "*the string that starts the function*" 

Antwort

57

Verwenden Sie das Modul unaccent, das mit PostgreSQL geliefert wird.

somedb=# CREATE EXTENSION unaccent; 
CREATE EXTENSION 
somedb=# SELECT unaccent('Hôtel'); 
unaccent 
---------- 
Hotel 

somedb=# SELECT * FROM table WHERE lower(unaccent(table.id)) = lower('Jose'); 

Und Geschwindigkeit Dinge ein wenig nach oben durch eine accentless Erzeugung niedriger gefasste Index:

somedb=# CREATE INDEX CONCURRENTLY ON table (lower(unaccent(id))); 
+3

Indexerstellung funktioniert nicht, da unaccent nicht unveränderlich ist. – usamec