PostgreSQL 中的连接属性

Posted

技术标签:

【中文标题】PostgreSQL 中的连接属性【英文标题】:Concatinating attributes in PostgreSQL 【发布时间】:2012-12-01 09:34:43 【问题描述】:

我正在尝试通过grouping 他们创建一个aggregate function concatenates 编号。我该怎么办?假设我在下面有一张这样的表格。

Table Numbers
123
145
187
105

我希望结果看起来像

105_123_145_187

如果我在 mysql 中工作,我知道如何使用 group_concat 分隔符 _

如何在 PostgreSQL 中做到这一点?

【问题讨论】:

总是在您的问题中包含您的 PostgreSQL 版本。你已经明白为什么了;您得到了答案,但您使用的是没有该功能的两个版本的旧 PostgreSQL,浪费了每个人的时间来跟进不同的方法。 【参考方案1】:

已经有这样的功能了:

SELECT string_agg(num::text,'_')
FROM Numbers;

详情请看:string_agg。

告诉我,如果您使用 postgresql 8.4 或更早版本。我将向您展示如何将此功能实现为自定义聚合。

UPD 自定义聚合:

CREATE OR REPLACE FUNCTION public.concat_delimited (text, text, text)
RETURNS text AS
$body$
  SELECT $1 || (CASE WHEN $1 = '' THEN '' ELSE $3 END) || $2;
$body$
LANGUAGE 'sql'
IMMUTABLE
RETURNS NULL ON NULL INPUT;

CREATE AGGREGATE public.text_concat (text, text)
(
  SFUNC = public.concat_delimited,
  STYPE = text
);

【讨论】:

@ignor im 使用的是早期版本 9.0 介意我问什么查询 SELECT $1 || (情况当 $1 = '' THEN '' ELSE $3 END)|| 2美元; do.....$1 是变量吗?? @theuserkaps $1 是函数的第一个参数。 $2 - 第二。您可以命名函数参数并使用它们的名称,也可以不命名它们并使用$1$2... 感谢该功能有效,虽然它没有对结果进行排序,但我可以在代码中的任何地方添加 orderby 吗?? @theuserkaps 试试concat_delimited(num::text,'_') OVER (ORDER BY num)【参考方案2】:

对于现代 PostgreSQL,请使用 string_agg(columnname,'_')

对于旧版本 8.4 及更高版本,请使用 string_to_array(array_agg(columname), '_')

见the array functions and operators documentation。

例子:

regress=> SELECT array_to_string(array_agg(x::text), ', ') FROM generate_series(1,10) x;
        array_to_string
-------------------------------
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
(1 row)

始终在您的问题中包含您的 PostgreSQL 版本。

【讨论】:

【参考方案3】:

concat_ws(sep text, str "any" [, str "any" [, ...] ]) 是您正在寻找的功能。

第一个参数是你的分隔符,NULL 参数被忽略。有关详细信息,请参阅The PostgreSQL manual。

我根本不精通 pgSQL,但是编写聚合函数的答案就在那里,请查看 the pgSQL manual 了解如何编写函数。

【讨论】:

concat_ws() 不是聚合函数。

以上是关于PostgreSQL 中的连接属性的主要内容,如果未能解决你的问题,请参考以下文章

Docker Compose 无法从数据库 (jdbc:postgresql://db:5432/postgres) 为用户“postgres”获取连接:连接尝试失败

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

postgres数据库连接driver,url,username,password

如何优化 Postgresql max_connections 和 node-postgres 连接池?

postgreSQL9.3版本安装好!pgadmin连接本机postgres数据库连接失败。。

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑