Функция удаления акцентов в postgreSQL

Возможный дубликат:
Поддерживает ли PostgreSQL «нечувствительный к диакритическому знаку» сопоставления?

Я пытаюсь удалить акценты, поэтому, когда я делаю SELECT, он их игнорирует.

Пример:

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

Он возвращает:

José
Jose
Jósé
Jóse

или что-то подобное.

Я нашел эти функции, и они не будут работать, я думаю, что это может быть связано с тем, что я использую Struts 1.X, пожалуйста, проверьте их и скажите, где я не прав или какую другую функцию мне следует использовать.

ПЕРВАЯ ФУНКЦИЯ

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;

ВТОРАЯ ФУНКЦИЯ

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; 

Обе функции генерируют следующую ошибку при запуске файла в NetBeans:

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

person chamini2    schedule 28.11.2012    source источник


Ответы (1)


Используйте модуль unaccent, поставляемый с 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');

И немного ускорьте процесс, сгенерировав индекс без акцента в нижнем регистре:

somedb=# CREATE INDEX CONCURRENTLY ON table (lower(unaccent(id)));
person titanofold    schedule 28.11.2012
comment
Создание индекса не работает, так как unaccent не является неизменным. - person usamec; 07.06.2016