postgres 中没有 FILTER 的潜在空字段的字符串聚合。

String Aggregation of potentially empty fields without FILTER in postgres.

在 Postgres 中,我试图在服务器数据的结果行中包含指向特定服务器的逗号分隔的链接 IP 地址列表。

最初我使用了 FILTER 功能,这对我的目的来说似乎很理想

STRING_AGG(ipadd, ',') FILTER ( WHERE ipadd is NULL OR ipadd != '') AS ipaddresses 

生成结果行如

  server1;data;etc; 1.2.3.4;
  server2;data;etc; 11.22.33.44, 22.33.44.55;
  server3;data;etc;
  server3;data;etc; 23.45.67.89

但是,我们发现 运行 服务器使用的是不支持 FILTER 功能的较低版本的 postgresql。

因此,我需要简化对

的调用
STRING_AGG(ipadd, ',') AS ipaddresses

由于第二个 table 返回的多行中可能存在空条目或空条目,returns 类似于以下内容:

  server1;data;etc; ,1.2.3.4,,,;
  server2;data;etc; 11.22.33.44,,, 22.33.44.55,,,;
  server3;data;etc; ,,,,,,,,,
  server3;data;etc; ,,23.45.67.89,,

每个空条目或空条目都会生成另一个包含在正确数据中的空字段。

是否有预过滤方法可以实现与上面的过滤查询相同的结果,或者甚至只是删除所有不分隔两个返回数据的逗号实例。

目前,我只是在调用后在服务器端解析这些内容,但如果可能的话,我更愿意在 SQL 端进行解析。

string_agg() 无论如何都会忽略 null 值,因此 is null 上的过滤器并不是真正必要的。

过滤条件 ipadd <> '' 可以简单地替换为 "converting" 一个空字符串到 null 值(然后聚合函数将忽略该值)

string_agg(nullif(ipadd,''), ',')

我会将 filter 替换为 case:

STRING_AGG(CASE WHEN ipadd is NULL or ipadd <> '' THEN ipadd END, ','
          )  AS ipaddresses