我正在寻找一种方法,通过查询连接组内字段的字符串。例如,我有一个表格:

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

我想通过company_id进行分组,以获得如下内容:

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

mySQL中有一个内置函数来执行这个group_concat


当前回答

我发现这个PostgreSQL文档很有用:http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html。

在我的例子中,如果字段不为空,我使用纯SQL将字段用括号连接起来。

select itemid, 
  CASE 
    itemdescription WHEN '' THEN itemname 
    ELSE itemname || ' (' || itemdescription || ')' 
  END 
from items;

其他回答

如何使用Postgres内置数组函数?至少在8.4中,这是开箱即用的:

SELECT company_id, array_to_string(array_agg(employee), ',')
FROM mytable
GROUP BY company_id;

我使用Jetbrains Rider,从上面的例子中复制结果并重新执行是一件麻烦的事情,因为它似乎将所有内容都包装在JSON中。这将它们连接到一个更容易运行的语句中

select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$

使用Postgres文档继续Kev的回答:

首先,创建一个元素数组,然后使用内置的array_to_string函数。

CREATE AGGREGATE array_accum (anyelement)
(
 sfunc = array_append,
 stype = anyarray,
 initcond = '{}'
);

select array_to_string(array_accum(name),'|') from table group by id;

你也可以使用format函数。它本身也可以隐式地处理text、int等类型转换。

create or replace function concat_return_row_count(tbl_name text, column_name text, value int)
returns integer as $row_count$
declare
total integer;
begin
    EXECUTE format('select count(*) from %s WHERE %s = %s', tbl_name, column_name, value) INTO total;
    return total;
end;
$row_count$ language plpgsql;


postgres=# select concat_return_row_count('tbl_name','column_name',2); --2 is the value

我发现这个PostgreSQL文档很有用:http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html。

在我的例子中,如果字段不为空,我使用纯SQL将字段用括号连接起来。

select itemid, 
  CASE 
    itemdescription WHEN '' THEN itemname 
    ELSE itemname || ' (' || itemdescription || ')' 
  END 
from items;