2012-11-28 14 views
15

Powiel możliwe:
Does PostgreSQL support “accent insensitive” collations?Funkcja usunąć akcenty w PostgreSQL

Próbuję usunąć akcenty więc kiedy robię SELECT ignoruje je.

Przykład:

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

Zwraca:

José 
Jose 
Jósé 
Jóse 

lub coś podobnego.

Znalazłem te funkcje i one nie działają, myślę, że to może być fakt, że używam Struts 1.X, proszę sprawdź je i powiedz, gdzie się mylę lub jaką inną funkcję powinienem posługiwać się.

pierwsza funkcja

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; 

Druga funkcja

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; 

Obie funkcje generowania następujący błąd podczas uruchamiania pliku w NetBeans:

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

Odpowiedz

57

Użyj modułu unaccent dostarczanego z PostgreSQL.

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

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

i szybkość rzeczy się trochę generując accentless, niższy obudowane index:

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

tworzenia indeksu nie działa, ponieważ unaccent nie jest niezmienna. – usamec

Powiązane problemy