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

标签 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

但是,据了解,将要运行的服务器使用不支持 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,,

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

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

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

最佳答案

string_agg()将忽略 null反正值所以过滤 is null真的没有必要。

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

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

关于sql - postgres 中没有 FILTER 的潜在空字段的字符串聚合。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33013616/

相关文章:

sql - 当您在 SERIAL 列中插入具有现有值的行时会发生什么?

json - 如何修剪 Postgres 的 JSON 数据类型中的空格?

sql - 在 JOIN 中选择最新记录时出现问题

java - JDBI 一对多连接和映射

mysql - postgresql 数据的间隔平均

sql-server - 内部联接并将多个表分组为一行

sql - Postgresql GROUP_CONCAT 等效?

sql - 如何将来自不同列的多个列组合到一个表或 View 中?

mysql - 更换 table 的正确方法是什么?