如何将select子查询中的多行转换为postgres中的单个列?

时间:2016-08-26 12:31:23

标签: sql postgresql psycopg2 postgresql-9.5

我尝试获取标记行列表并将其作为CSV添加到列中。我认为子查询适合使用string_agg。在eventstags下面是一个多对多表,将标签与其事件相关联。

(SELECT string_agg(name, ',') FROM tags WHERE tags.id IN (SELECT eventstags.tags_id WHERE eventstags.events_id = events.id)) AS tags

这似乎只返回一个标记,就好像它忽略了所有其他标记行一样。知道如何让IN查询知道其他行,以便将标记名称连接成CSV列吗?

我使用psycopg2和Postgres 9.5

1 个答案:

答案 0 :(得分:0)

创建agregate:

CREATE AGGREGATE str_sum(text) (
  SFUNC=strcat,
  STYPE=text,
  INITCOND=''
);

和功能:

CREATE OR REPLACE FUNCTION strcat(text, text)
  RETURNS text AS
$BODY$
  begin
    if $1 = '' then
      return $2;
    else
      return ( $1 || ', ' ) || $2;
    end if;
  end;
$BODY$
  LANGUAGE plpgsql STABLE

并在子查询中使用str_sum:

SELECT str_sum(name) FROM tags