2016-09-09 13 views
0

PostgreSQL9.5で文字列を受け取り、別の言語に翻訳するカスタム関数を作成しようとしています。 私が翻訳しようとしている文字列の特有のことは、要素のリストなので、文法上の意味を全く必要としないということです。postgresの翻訳カスタム機能

例の翻訳は、次のようになります。

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; 

はあなたのよう問題は、この関数が1つの翻訳に対してのみ機能することです。

私はこの機能を複数回使用して、複数の要素を置き換えて望みの結果を得ても大丈夫でしたが、これを行うより良い方法があると確信しています。私が提案した

この問題を回避するには、例えば次のとおりです。

select translate_en_es(translate_en_es('apple | banana')) 

文字列内の要素として多くの機能を追加する必要がないように、どのように私はそれを行うことができますか?クエリがテーブルを検索し、見つかったスペイン語の単語を返す、指定された英語の文章について

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'); 

+0

は、関数内で上記のクエリを使用しますか?次に正しい翻訳を見つけるために単純な 'select'をとるでしょう。 – redneb

+0

例のテーブルの4番目の行のような複数の単語を含むすべての組み合わせを作成する必要があります。 – johan855

+0

この要件を満たしていても、テーブルで作業できるようにすることは可能です。 – redneb

答えて

0

第一印象は、テーブルの形式で辞書を必要とすることです。

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) 
関連する問題