postgres中的翻译自定义功能

时间:2016-09-09 14:55:35

标签: postgresql stored-procedures translation plpgsql

我正在尝试在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'))

我该怎么做才能在字符串中添加与元素一样多的函数?

1 个答案:

答案 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)