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

dz6r00yl  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(5)|浏览(1302)

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

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
    ...
hsvhsicv

hsvhsicv1#

替换()

如果你只想替换一个或几个字符,你可以使用函数replace(string text,from text,to text)来替换字符串substring中的所有字符。replace函数可以用来替换一个字符到几个字符。

翻译()

如果要将某些字母转换为其他字母,可以使用函数translate(string text,from text,to text),将字符串中与from中的字符匹配的任何字符替换为to集中的相应字符。
一些可供使用的数据:

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');

replace函数示例:

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

translate函数示例:

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

sshcrbum

sshcrbum2#

不,没有这个函数。也许写优化的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上,它在200 ms下进行6000次转换(但我有PostgreSQL的开发人员构建-它更慢)。

pieyvz9o

pieyvz9o3#

如果你想要德语字母,那么这个方法就可以:

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$;

虽然它并不优雅。

92vpleto

92vpleto4#

避免编写自己的非重音函数。相反,我建议使用非重音扩展。

create extension unaccent;
select unaccent('Juhänäo');
select unaccent(name) from xyz;

这里是Postgres documentation for Unaccent的链接

kh212irz

kh212irz5#

您只需使用以下代码:

select  translate(column, 'âàãáéêèíóôõüúç', 'aaaaeeeiooouuc') from table

祝你好运^^

相关问题