Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接函数PostgreSQL中的行_Sql_Postgresql_Plpgsql - Fatal编程技术网

连接函数PostgreSQL中的行

连接函数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

假设有一个包含项目名称、位置、团队id、开始和结束年份的表projects。如何连接行,以便相同的名称将其他信息合并为一个字符串

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;