【问题标题】:Postgresql - Stuck building a plpgsql functionPostgresql - 卡住构建 plpgsql 函数
【发布时间】:2015-04-05 08:05:54
【问题描述】:

我是 plpgsql 的初学者,我一直在编写一个函数。 我需要一个执行以下操作的函数:

给出一个表,该表中的 id_field 和该表中的另一个字段:

原始表

id_field     field_traspose
---------    --------------
    1              A
    1              B
    1              C
    2              A
    3              F
    3              X

结果

id_field     field_traspose
---------    --------------
    1              A, B, C
    2              A
    3              F, X

我的尝试:

CREATE OR REPLACE FUNCTION traspose(mytable character varying, id_field character varying, field_traspose character varying)
  RETURNS setof RECORD AS
$BODY$ 
DECLARE
    r record;
    result record;
BEGIN

FOR r IN EXECUTE 'SELECT '||id_field||','||field_traspose||'  from '||mytable LOOP

-- Here should go the logic that joins every field_traspose for a same id_field and
--returns the record as one of the returning records (can be many different id_fields)   

RETURN NEXT result;
END LOOP;

RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

我被困在这一点上。 问候,

【问题讨论】:

标签: postgresql function user-defined-functions plpgsql


【解决方案1】:

不需要这样的功能,这已经是内置的了:

select id_field, 
       string_agg(field_traspose, ', ' order by field_traspose) 
from the_table 
group by id_field
order by id_field;

【讨论】:

  • 我在 Postgresql 8.4 中,你确定这在 8.4 中有效还是仅在 9 以上有效?我收到语法错误
  • 8.4 已停产,您需要升级。使用 array_agg() 和 array_to_string() 可以获得与 string_agg() 相同的结果,只是需要一些额外的工作。从 9.0 版开始,您可以默认使用 string_agg(),但您可以在 8.4 中自己创建此函数
猜你喜欢
  • 2012-04-23
  • 2020-02-04
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多