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 连接池?