在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方面做这件事。
答案 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