仅当其他 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;
使用 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;
我有一个 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;
使用 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;