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)