【问题标题】:Concatinating attributes in PostgreSQLPostgreSQL 中的连接属性
【发布时间】: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,浪费了每个人的时间来跟进不同的方法。

标签: postgresql concatenation aggregate-functions group-concat


【解决方案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() 不是聚合函数。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2016-12-06
    • 2020-05-16
    相关资源
    最近更新 更多