0

在 PSQL 中,我从一个名为 genus_synonym 的表中聚合连接的字符串

表格示例如下

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

这是我的桌子的图像,如果这更容易的话

我使用的代码是这样的

Select

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

FROM

 "public"."synonyms" as s

结果是:
Acer rubrum、Acer nigrum、Betula lenta、Carya ovata、Carya glabra、Carya tomentosa

我想弄清楚的是是否有可能产生这个:

Acer rubrum、A. nigrum、Betula lenta、Carya ovata、C. glabra、C. tomentosa

基本上我想将属名缩写为一个字母,后面有一个句点,第二次和另外一次重复一个属。

即使这是不可能的,最好知道这一点,然后如果有另一种方法可以解决这个问题。

此外,看起来没有人在回答我的问题。不清楚吗?我以前找不到这样的问题。请让我知道我可以做些什么来使这个问题变得更好。

4

1 回答 1

0

问:

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
于 2017-05-02T08:56:11.340 回答