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

时间:2015-10-08 10:47:14

标签: sql postgresql string-aggregation

在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

然而,已经发现它将运行的服务器使用较低版本的postgresql,它不支持FILTER功能。

由于这个原因,我需要简化对

的调用
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,,

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

是否有一种前FILTER方式可以获得与上面的FILTER查询相同的结果,甚至只是删除所有未分隔两个返回的数据的逗号实例。

目前我只是在调用之后在服务器端解析这些问题,但如果可能的话,我宁愿在SQL方面做这件事。

2 个答案:

答案 0 :(得分:3)

无论如何,

string_agg()会忽略null值,因此is null上的过滤器不是必需的。

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

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

答案 1 :(得分:1)

我会将filter替换为case

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