使用array_agg()返回函数的类型

时间:2013-11-26 21:15:28

标签: sql arrays function postgresql plpgsql

我正在尝试创建一个返回字符串数组的函数,我能够在没有函数的情况下执行它并返回record[]类型,当我尝试在函数中返回该类型的结果时它说不支持。

CREATE OR REPLACE FUNCTION alarmEventList(sampleid integer
                         , starttime timestamp without time zone
                         , stoptime timestamp without time zone)
RETURNS text[] AS
DECLARE
result record[];
BEGIN

select array_agg(result)
    from (select to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS'), "AlertLevel"
               , "Timestamp" - lag("Timestamp") over (order by "Timestamp")
          from "Judgements"
          WHERE "SampleID"=sampleid and "Timestamp" >= starttime
          and "Timestamp" <= stoptime) as result where "AlertLevel" >0;

return result;
END

Definition of Judgements
ID      | SampleID | AlertLevel | Timestamp               
integer | integer  | integer    | timestamp with time zone
   1    |    11    |    1       | 2013-09-17 10:36:40
   2    |    11    |    0       | 2013-09-17 10:36:45
   3    |    11    |    2       | 2013-09-17 10:36:51

我正在考虑返回text[],但我找不到将此查询作为文本类型或字符串的方法。

我想要返回这样的内容:

{"2013-11-21 10:36:40, 1, 10", "etc...etc..."}

1 个答案:

答案 0 :(得分:2)

函数需要声明一个返回类型。数组只能基于众所周知的基类型构建。不允许匿名记录。因此,创建一个适合您需求的复合类型。

CREATE TYPE my_type (
  ts          text
 ,alertlevel  int
 ,time_passed interval
);

出于测试目的,您还可以创建临时表以在会话期间注册复合类型:

CREATE TEMP TABLE my_type ( ...)

临时。在会话结束时删除表,并且在该类型之后构建的任何函数将在此之后被破坏。

将其用作数组的基本类型。您可以使用更简单的sql函数:

CREATE OR REPLACE FUNCTION foo()
  RETURNS my_type[] AS
$func$
SELECT array_agg(result::my_type)  -- you must cast the record!
FROM  (
   SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
          ,"AlertLevel"
          ,"Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
   FROM   "Judgements"
   WHERE  "SampleID" = sampleid
   AND    "Timestamp" >= starttime
   AND    "Timestamp" <= stoptime
   ) result
WHERE "AlertLevel" > 0;
$func$
LANGUAGE sql;

呼叫:

SELECT foo();

使用text []

的简单替代方法

当然,您也可以投放到text / text[]。您丢失了列名称和类型信息,但它开箱即用:

CREATE OR REPLACE FUNCTION foo()
  RETURNS text[] AS
$func$
SELECT array_agg(result::text)  -- cast the record to text!
FROM  ( ... ) result
...;
$func$
LANGUAGE sql;

如果您实际上不需要数组,则可以废弃array_agg(),返回单个行并使用RETURNS TABLE (...)声明返回类型。在标记下搜索SO,您会找到很多示例..

请记住使用以下方法调用此类函数:

SELECT * FROM foo();