2012-11-28 17 views
15

Eventuali duplicati:
Does PostgreSQL support “accent insensitive” collations?funzione per rimuovere gli accenti in PostgreSQL

Sto cercando di rimuovere gli accenti in modo che quando faccio un SELEZIONARE li ignora.

Esempio:

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

Restituisce:

José 
Jose 
Jósé 
Jóse 

o qualcosa di simile.

Ho trovato queste funzioni e non funzionano, penso che potrebbe essere il fatto che sto usando Struts 1.X, per favore controllale e dimmi dove ho sbagliato o quale altra funzione dovrei uso.

prima funzione

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; 

SECONDA FUNZIONE

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; 

Entrambe le funzioni generano il seguente errore quando ho eseguito il file in NetBeans:

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

risposta

57

Utilizzare il modulo unaccent fornito con 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'); 

e velocizzare le cose un po generando un di accento, indice in minuscolo:

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

creazione indice non funziona, dal momento che unaccent non è immutabile. – usamec

Problemi correlati