问题描述
我有一张桌子,上面有植物的科学名称和通用名称。
gensp vernacular
Allamanda blanchetii
Allamanda blanchetii Alamanda morada
Allamanda blanchetii Purple allamanda
Allamanda puberula
Aspidosperma cuspa
Aspidosperma cuspa Guatambuzinho
我需要这个才能成为:
gensp vernacular
Allamanda blanchetii Alamanda morada,Purple allamanda
Allamanda puberula
Aspidosperma cuspa Guatambuzinho
我在Postgres上尝试了以下SQL。
select gensp,string_agg(vernacular,',') as vernacular from (
select distinct gen||' '||sp as gensp,spm.vernacular from sp
join col on idsp = sp.id
join spm on idcol = col.id
where fam = 'Apocynaceae' and gen||' '||sp != ''
order by gensp,vernacular
) sub
group by gensp
但是它返回:
gensp vernacular
Allamanda blanchetii,Alamanda morada,Purple allamanda
Allamanda puberula
Aspidosperma cuspa,Guatambuzinho
请注意,空的本地名称如何出现在聚合字符串上。因此,我需要删除这些行,但前提是其他行具有名称(否则 Allamanda puberula 将从查询中删除)。
我该怎么做?
解决方法
使用filter
和coalesce
处理空值或null
vernacular
的值。
select sp,coalesce(
string_agg(vernacular,',')
filter (where coalesce(vernacular,'') != ''),'')
from plants
group by sp;
OP设计的简单答案@Rodrigo:
select sp,coalesce(string_agg(nullif(vernacular,''),'))
from plants
group by sp;
,
我不知道您的查询与您的问题有什么关系。但是您所描述的似乎是简单的字符串聚合:
select sp,string_agg(vernacular,')
from t
group by sp;