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

How to remove empty Bs from PostgreSQL query only if other Bs have a value (for each A)?

我有一个 table,其中包含植物的科学名称和常用(白话)名称。

               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

我尝试了以下 SQL(在 Postgres 上)。

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

但是 returns:

               gensp                          vernacular
Allamanda blanchetii , Alamanda morada, Purple allamanda
  Allamanda puberula                                    
  Aspidosperma cuspa                     , Guatambuzinho

注意空的白话名称是如何出现在聚合字符串上的。所以我需要删除这些行,但前提是其他一些行有名称(否则 Allamanda puberula 将从查询中删除)。

我该怎么做?

我不知道你的查询与你的问题有什么关系。但是你所描述的似乎是简单的字符串聚合:

select sp, string_agg(vernacular, ', ')
from t
group by sp;

使用 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;