我有一个包含可能包含特殊字符的名称列表的表:
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
...
答案 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
更多信息:
答案 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$;
虽然不优雅。