如何在Postgres 9.5中替换多个特殊字符

时间:2016-07-27 16:57:00

标签: postgresql special-characters

我有一个包含可能包含特殊字符的名称列表的表:

id   name
1    Johän
2    Jürgen
3    Janna
4    Üdyr
...

是否有一个功能可以替换另一个特定的角色? (不一定是无意义的)。像这样:

SELECT id, function('ä,ü',name,'ae,ue');
Result:

    id   name
    1    Johaen
    2    Juergen
    3    Janna
    4    UEdyr
    ...

3 个答案:

答案 0 :(得分:3)

不,没有这个功能。可能不是很难写出优化的C扩展是什么呢。但C语言并不是必需的。您可以尝试SQL或PLpgSQL函数:

CREATE OR REPLACE FUNCTION xx(text, text[], text[])
RETURNS text AS $$
   SELECT string_agg(coalesce($3[array_position($2, c)],c),'')
      FROM regexp_split_to_table($1,'') g(c)
$$ LANGUAGE sql;

postgres=# select xx('Jürgen', ARRAY['ä','ü'], ARRAY['ae','ue']);
┌─────────┐
│   xx    │
╞═════════╡
│ Juergen │
└─────────┘
(1 row)

在我的comp上它在200ms下进行了6000次转换(但是我有开发人员构建的PostgreSQL - 它更慢)。

答案 1 :(得分:1)

<强>替换()

如果您只想替换一个或几个字符,可以使用函数替换(字符串文本,从文本到文本)替换字符串子字符串中的所有匹配项。替换功能可用于将一个字符替换为多个字符。

<强>翻译()

如果你想将一些字母翻译成其他字母,你可以使用函数translate(字符串文本,从文本到文本)来替换字符串中与from中的字符相匹配的任何字符。

要播放的一些数据:

drop table if exists xyz;

create table xyz (
    id serial not null,
    name varchar(30)
);

insert into xyz (name) values
    ('Juhänäo'),
    ('Jürgüen'),
    ('Dannäu'),
    ('Übüdyr');

替换功能示例:

select replace(name, 'ä', 'a') from xyz;

此功能用字母a替换名称列中的字母ä。 Juhänäo成为Juhanao。

select replace(name, 'ä', 'ae') from xyz;

现在用ae替换字母ä。

select replace(replace(replace(name, 'ä', 'ae'), 'ü', 'ue'), 'Ü', 'Ue') from xyz;

不是很好,但在这个例子中,所有ä成为ae,ü成为ue,并且Ü成为'Ue'。

update xyz set name = replace(replace(replace(name, 'ä', 'ae'), 'ü', 'ue'), 'Ü', 'Ue');

更改字母和更新行。更新的结果如下:

Juhaenaeo
Juergueen
Dannaeu
Uebuedyr

翻译功能示例:

select translate(name, 'ä,ü,Ü', 'a,u,U') from xyz;

将所有字母ä翻译为a,ü至u和Ü至U.

update xyz set name = translate(name, 'ä,ü,Ü', 'a,u,U');

更新表,以便翻译所有预定义字母,并将更改保存到数据库中。更新的结果如下:

Juhanao
Jurguen
Dannau
Ubudyr

更多信息:

Replace characters with multi-character strings

Postgresql string functions

答案 2 :(得分:0)

如果您在寻找德语字母,那么这很有效:

CREATE OR REPLACE FUNCTION public.udf_transliterate_german(
    german_word character varying)
    RETURNS character varying
    LANGUAGE 'sql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
SELECT REPLACE(
    REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(german_word,
                                'ä','ae'),
                            'ö','oe' ),
                        'ü','ue'),
                    'ß','ss'),
                'Ä', 'AE'),
            'Ö', 'OE'),
        'Ü', 'UE'),
    'ẞ', 'SS');
$BODY$;

虽然不优雅。