我正在尝试编写一个触发器,从另一个表获取数据(多行)后,我必须在其中创建一个Json。我有两个表任务和数据。数据表包含有关键/值对中任务的多个信息。
task schema
taskid
description
value
数据表架构
id
taskid
key
value
现在在触发器中,我想获取与任务相对应的所有数据,并从中准备一个JSON。我在下面使用
CREATE OR REPLACE FUNCTION event()
RETURNS trigger AS
$BODY$
DECLARE
_eventType varchar:='Task';
_jsondata json;
_message json;
_entity json;
_data data;
BEGIN
SELECT * INTO _data FROM data WHERE data.taskid = New.taskid;
IF TG_OP = 'INSERT' THEN
_messag:=json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);
END IF;
_entity:= json_build_object('entity',_eventType);
_jsondata := json_build_object('event',_entity,'payload',_message);
INSERT INTO events(message)
VALUES(_jsondata);
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
这里,我正在使用下面的查询从对应于taskid的数据表中获取所有数据
SELECT * INTO _data FROM data WHERE data.taskid = New.taskid;
这里,问题是我只能得到一行。如何获取所有行?如果有人有什么想法?
您可以将所有内容聚合为一个JSON值:
declare
...
_data jsonb; --<< change the data type to jsonb
begin
...
IF TG_OP = 'INSERT' THEN
-- only select everything if you really need it
SELECT jsonb_agg(to_jsonb(data))
INTO _data
FROM data
WHERE data.taskid = New.taskid;
_message := json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);
END IF;
...
CREATE OR REPLACE FUNCTION event()
RETURNS trigger AS
$BODY$
DECLARE
_eventType varchar:='Task';
_jsondata json;
_message json;
_entity json;
_data jsonb;
BEGIN
**SELECT json_agg(tmp)
INTO _data
FROM (
-- Your subquery goes here, for example:
SELECT data.key, data.value
FROM.data
WHERE data.taskid = New.taskid
) tmp;**
IF TG_OP = 'INSERT' THEN
_messag:=json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);
END IF;
_entity:= json_build_object('entity',_eventType);
_jsondata := json_build_object('event',_entity,'payload',_message);
INSERT INTO events(message)
VALUES(_jsondata);
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
研究链接:select statement in postgres function called inside a trigger