postgres 中的翻译自定义函数
Translation custom function in postgres
我正在尝试在 PostgreSQL9.5 中制作一个自定义函数,它接受一个字符串并将其翻译成另一种语言。
我尝试翻译的字符串的特殊之处在于它们只是一个元素列表,因此根本不需要它们具有语法意义。
翻译示例如下:
normal_string translated_string
apple manzana
banana banano
tiger tigre
elephant | monkey | apple elefante | mico | manzana
the elephant ate a banana the elefante ate a banano
我已经进步了一点,找到了一种方法,这是我创建的函数:
CREATE OR REPLACE FUNCTION translate_en_es(to_translate character varying)
RETURNS character varying AS $result$
declare
result character varying;
BEGIN
SELECT
case when to_translate like 'apple' then replace(to_translate,'apple','manzana')
when to_translate like 'elephant' then replace(to_translate,'elephant','elefante')
...
...
else to_translate end::character varying
into result;
RETURN result;
END;
$result$ LANGUAGE plpgsql;
如您所见,问题在于此功能仅适用于一种翻译。
我可以多次使用这个函数来替换多个元素并获得我想要的结果,但我确信有更好的方法来做到这一点。
我提出的解决方法例如:
select translate_en_es(translate_en_es('apple | banana'))
我该怎么做才能不需要添加与字符串中的元素一样多的函数?
第一印象是你需要一个 table:
形式的字典
create table dictionary (id serial primary key, english text, spanish text);
insert into dictionary (english, spanish) values
('apple', 'manzana'),
('banana', 'banano'),
('tiger', 'tigre'),
('monkey', 'mico');
对于给定的英语句子,查询搜索 table 和 returns 找到的西班牙语单词。
select english, spanish
from dictionary
join (
select regexp_split_to_table('the monkey ate a banana', '\W+') word
) words
on word = english;
english | spanish
---------+---------
banana | banano
monkey | mico
(2 rows)
注意,我们必须将句子拆分成单词(参见函数 regexp_split_to_table()
)。
在函数中使用上面的查询:
create or replace function english_to_spanish (sentence text)
returns text language plpgsql as $$
declare
r record;
begin
for r in
select english, spanish
from dictionary
join (
select regexp_split_to_table(sentence, '\W+') word
) words
on word = english
loop
sentence:= replace(sentence, r.english, r.spanish);
end loop;
return sentence;
end $$;
select english_to_spanish ('the monkey ate a banana');
english_to_spanish
-----------------------
the mico ate a banano
(1 row)
我正在尝试在 PostgreSQL9.5 中制作一个自定义函数,它接受一个字符串并将其翻译成另一种语言。 我尝试翻译的字符串的特殊之处在于它们只是一个元素列表,因此根本不需要它们具有语法意义。
翻译示例如下:
normal_string translated_string
apple manzana
banana banano
tiger tigre
elephant | monkey | apple elefante | mico | manzana
the elephant ate a banana the elefante ate a banano
我已经进步了一点,找到了一种方法,这是我创建的函数:
CREATE OR REPLACE FUNCTION translate_en_es(to_translate character varying)
RETURNS character varying AS $result$
declare
result character varying;
BEGIN
SELECT
case when to_translate like 'apple' then replace(to_translate,'apple','manzana')
when to_translate like 'elephant' then replace(to_translate,'elephant','elefante')
...
...
else to_translate end::character varying
into result;
RETURN result;
END;
$result$ LANGUAGE plpgsql;
如您所见,问题在于此功能仅适用于一种翻译。
我可以多次使用这个函数来替换多个元素并获得我想要的结果,但我确信有更好的方法来做到这一点。
我提出的解决方法例如:
select translate_en_es(translate_en_es('apple | banana'))
我该怎么做才能不需要添加与字符串中的元素一样多的函数?
第一印象是你需要一个 table:
形式的字典create table dictionary (id serial primary key, english text, spanish text);
insert into dictionary (english, spanish) values
('apple', 'manzana'),
('banana', 'banano'),
('tiger', 'tigre'),
('monkey', 'mico');
对于给定的英语句子,查询搜索 table 和 returns 找到的西班牙语单词。
select english, spanish
from dictionary
join (
select regexp_split_to_table('the monkey ate a banana', '\W+') word
) words
on word = english;
english | spanish
---------+---------
banana | banano
monkey | mico
(2 rows)
注意,我们必须将句子拆分成单词(参见函数 regexp_split_to_table()
)。
在函数中使用上面的查询:
create or replace function english_to_spanish (sentence text)
returns text language plpgsql as $$
declare
r record;
begin
for r in
select english, spanish
from dictionary
join (
select regexp_split_to_table(sentence, '\W+') word
) words
on word = english
loop
sentence:= replace(sentence, r.english, r.spanish);
end loop;
return sentence;
end $$;
select english_to_spanish ('the monkey ate a banana');
english_to_spanish
-----------------------
the mico ate a banano
(1 row)