我正在尝试创建一个返回字符串数组的函数,我能够在没有函数的情况下执行它并返回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..."}
答案 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[]
。您丢失了列名称和类型信息,但它开箱即用:
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 (...)
声明返回类型。在plpgsql标记下搜索SO,您会找到很多示例..
请记住使用以下方法调用此类函数:
SELECT * FROM foo();