我正在尝试在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'))
我该怎么做才能在字符串中添加与元素一样多的函数?
答案 0 :(得分:0)
第一印象是你需要一张桌子形式的字典:
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');
对于给定的英语句子,查询搜索表并返回找到的西班牙语单词。
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)