1

在 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

由于从第二个表返回的多行中可能存在空或空条目,因此返回如下内容:

  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,,

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

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

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

4

2 回答 2

5

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

过滤条件ipadd <> ''可以通过简单地将一个空字符串“转换”为一个null值来替换(然后会被聚合函数忽略)

string_agg(nullif(ipadd,''), ',')
于 2015-10-08T10:53:13.727 回答
4

我将替换filtercase

STRING_AGG(CASE WHEN ipadd is NULL or ipadd <> '' THEN ipadd END, ','
          )  AS ipaddresses 
于 2015-10-08T10:54:26.220 回答