仅当其他B具有值对于每个A时,如何从PostgreSQL查询中删除空B?

问题描述

我有一张桌子,上面有植物的科学名称和通用名称。

               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 将从查询中删除)。

我该怎么做?

解决方法

使用filtercoalesce处理空值或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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...