创建返回文本数组的函数

Jer*_*emy 2 sql postgresql stored-procedures plpgsql

我尝试创建一个函数,该函数将返回以下查询的内容,其中 proto_location 的类型为文本。不确定这是否重要,但我当前调用此查询的 java 代码只是将每条记录读取为字符串。

SELECT DISTINCT tm.proto_location
FROM track_message tm
WHERE tm.workflow_analytic_instance_id = 204
AND EXISTS ( SELECT *
    FROM track_message_to_track_mapping tm2tm
    JOIN track t ON t.id = tm2tm.track_id
    JOIN track_item ti ON t.id = ti.track_id
    JOIN track_point tp ON ti.id = tp.track_item_id
    WHERE tm.id =tm2tm.track_message_id
    AND ti.item_time BETWEEN 1328816277089000 AND 1328816287089000
    AND ST_Intersects
            (tp.track_position
            , ST_GeomFromText('POLYGON((-144 59, -41 46, -75 15, -127 25, -144 59))',4326)
            )
    )
    ;
Run Code Online (Sandbox Code Playgroud)

这是我的功能

CREATE OR REPLACE Function getTrackMessages(workflow bigint, start_time bigint, end_time bigint) returns text[]
as $$
SELECT DISTINCT tm.proto_location
FROM track_message tm
WHERE tm.workflow_analytic_instance_id = $1AND EXISTS ( SELECT *
    FROM track_message_to_track_mapping tm2tm
    JOIN track t ON t.id = tm2tm.track_id
    JOIN track_item ti ON t.id = ti.track_id
    JOIN track_point tp ON ti.id = tp.track_item_id
    WHERE tm.id =tm2tm.track_message_id
    AND ti.item_time BETWEEN $2 AND $3        AND ST_Intersects
            (tp.track_position
            , ST_GeomFromText('POLYGON((-144 59, -41 46, -75 15, -127 25, -144 59))',4326)
            )
    )
    ;
$$ Language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我不断收到一条错误消息,指出“select”处或附近的语法错误及其引用的行

SELECT DISTINCT tm.proto_location
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

创建或替换函数 get_track_messages(工作流程 bigint, start_time bigint, end_time bigint)
  返回SETOF 文本
  语言sql AS
$函数$
选择不同的 tm.proto_location
来自 track_message tm
其中 tm.workflow_analytic_instance_id = $1
并且存在(
    从 track_message_to_track_mapping tm2tm 中选择
    连接轨道 t ON t.id = tm2tm.track_id
    JOIN track_item ti ON t.id = ti.track_id
    JOIN track_point tp ON ti.id = tp.track_item_id
    其中 tm.id = tm2tm.track_message_id
    并且 ti.item_time 介于 $2 和 $3 之间
    AND ST_Intersects (tp.track_position
                        , ST_GeomFromText('多边形((-144 59, -41 46, -75 15, -127 25, -144 59))',4326))
    );
$函数$;

最重要的是,它可以像sql函数一样工作。
对于 PL/pgSQL 函数,您需要进行更多更改:

创建或替换函数 get_track_messages(workflow bigint
                                            , 开始时间 bigint
                                            , end_time bigint)
  返回SETOF 文本
  语言plpqsql AS
$函数$
开始
   退货查询
   选择不同的...;
结束
$func$;

如果查询返回超过 1 行,您还需要SETOF(正如您自己计算的那样)。使用以下命令调用该函数:

SELECT * FROM get_track_messages( ... );
Run Code Online (Sandbox Code Playgroud)

手册中有关从函数返回的更多信息。

数据类型

proto_location是一个字符类型。如果您实际上想返回一个文本数组(例如您的标题状态),您可以像这样聚合:

SELECT array_agg(DISTINCT tm.proto_location) ...
Run Code Online (Sandbox Code Playgroud)

并将函数的返回类型调整为SETOF text[].

对于排序数组:

SELECT array_agg(DISTINCT tm.proto_location ORDER BY proto_location) ...
Run Code Online (Sandbox Code Playgroud)

或者,要获取排序列表 ( text) 而不是数组 ( text[]):

SELECT string_agg(DISTINCT tm.proto_location ORDER BY proto_location, ', ') ...
Run Code Online (Sandbox Code Playgroud)

看: