2016-12-12 6 views
0

の内部文字列を扱う私はPSQLでstring_agg

id|genus_synonym|specific_epithet_synonym 
---|----------|----------- 
1 | Acer | rubrum 
2 | Acer | nigrum 
3 | Betula | lenta 
4 | Carya | ovata 
5 | Carya | glabra 
6 | Carya | tomentosa 

here is an image of my table if that is easier

を次のようにテーブルの一例であるgenus_synonym

というテーブルから連結ストリングを集約してい私が使用しているコードはこのようなものです

Select 

string_agg(CONCAT(CONCAT(s."genus_synonym"), ' ', s.specific_epithet_synonym), ', ')as syno 

FROM 

"public"."synonyms" as s 

結果は次のとおりです。
エイサールブルム、Acerのコショウ、カバノキlenta、Caryaのovata、Caryaグラブラ、Caryaトメントーサ

私は何を把握しようとしていますが、代わりに、これを製造することが可能である場合である。

トメントーサ

エイサールブルム、A.のコショウ、カバノキlenta、Carya ovata、C.グラブラ、C.は、基本的に私は2番目と追加のために、それを以下の期間で、単一の文字に属名を短縮したいのです属が繰り返される時間。

これが不可能であっても、これを知っているといいでしょうし、別の方法があればこれを解決することができます。

また、誰も私の質問に反応していないようです。それは明確ではないのですか?私はこれまでに尋ねられているようなものは見つけられませんでした。この質問をより良くするために私ができることを教えてください。

答えて

0

たqry:

t=# with a as (
    select *,case when row_number() over (partition by genus_synonym) > 1 and count(1) over (partition by genus_synonym) > 1 then substr(genus_synonym,1,1)||'.' else genus_synonym end sh 
    from s92 
) 
select string_agg(concat(sh,' ',specific_epithet_synonym),',') 
from a; 
           string_agg 
----------------------------------------------------------------------- 
Acer rubrum,A. nigrum,Betula lenta,Carya ovata,C. glabra,C. tomentosa 
(1 row) 

Time: 0.353 ms 

モックアップあなたのデータ:

t=# create table s92 (id int,genus_synonym text,specific_epithet_synonym text); 
CREATE TABLE 
Time: 7.587 ms 
t=# copy s92 from stdin delimiter '|'; 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> 1 | Acer | rubrum 
2 | Acer | nigrum 
3 | Betula | lenta 
4 | Carya | ovata 
5 | Carya | glabra 
6 | Carya | tomentosa 
>> >> >> >> >> >> \. 
COPY 6 
Time: 6308.728 ms