连接函数PostgreSQL中的行
假设有一个包含项目名称、位置、团队id、开始和结束年份的表projects。如何连接行,以便相同的名称将其他信息合并为一个字符串连接函数PostgreSQL中的行,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,假设有一个包含项目名称、位置、团队id、开始和结束年份的表projects。如何连接行,以便相同的名称将其他信息合并为一个字符串 name location team_id start end Library Atlanta 2389 2015 2017 Library Georgetown 9920 2003 2007 Museum Au
name location team_id start end
Library Atlanta 2389 2015 2017
Library Georgetown 9920 2003 2007
Museum Auckland 3092 2005 2007
预期输出如下所示:
name Records
Library Atlanta, 2389, 2015-2017
Georgetown, 9920, 2003-2007
Museum Auckland, 3092, 2005-2007
每行应包含行尾/新行字符
我有一个函数用于此,但我认为仅使用CONCAT
是不可行的。还有什么其他方法可以做到这一点?我尝试的是:
CREATE OR REPLACE TYPE projects (name TEXT, records TEXT);
CREATE OR REPLACE FUNCTION records (INT)
RETURNS SETOF projects AS
$$
RETURN QUERY
SELECT p.name
CONCAT(p.location, ', ', p.team_id, ', ', p.start, '-', p.end, CHAR(10))
FROM projects($1) p;
$$
LANGUAGE PLpgSQL;
我尝试使用CHAR(10)作为新行,但它给出了一个语法错误(不确定为什么?)
上面的示例连接字符串,但预期会忽略重复的名称。您不需要PL/pgSQL 首先使用
DISTINCT
消除重复的name
s,然后在子查询中可以concat
将列转换为单个字符串。然后使用array\u agg
从中创建一个数组。然后它将“合并”多个数组,以防子查询返回多行。最后,使用array\u to\u string
去掉逗号和大括号。不使用换行符的char值,只需使用E'\n'
(E
代表):
- 注意:尽量不要使用保留字符串(例如
,结束
,名称
等)来命名列。虽然PostgreSQL允许您使用它们,但这被认为是一种不好的做法开始
select
name,
string_agg( concat(location, ', ', team_id, ', ', start, '-', "end"), E'\n') AS records
FROM t
group by name;
select
name,
string_agg( concat(location, ', ', team_id, ', ', start, '-', "end"), E'\n') AS records
FROM t
group by name;