PLpgSQL:将每条记录存储在 For Loop 中并返回 json
Posted
技术标签:
【中文标题】PLpgSQL:将每条记录存储在 For Loop 中并返回 json【英文标题】:PLpgSQL: Store each record in For Loop and returns json 【发布时间】:2017-08-04 09:21:27 【问题描述】:我正在尝试将记录或 json 存储到数组中并从函数返回 JSON:
CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$
DECLARE
RR RECORD;
SS json[];
BEGIN
FOR RR IN (SELECT DISTINCT date
FROM timetable WHERE date<CURRENT_DATE ORDER BY date ASC)
LOOP
SELECT row_to_json(A) INTO SS FROM (SELECT RR.date as Dia, count(*) Total
FROM dates WHERE office_date=RR.date) A;
END LOOP;
RETURN json_agg(SS);
END; $$
LANGUAGE plpgsql;
错误:
ERROR: malformed array literal: ""dia":"2017-07-24","total":228"
DETAIL: Unexpected array element.
CONTEXT: PL/pgSQL function stat_per_day() line 8 at SQL statement
查询稍微复杂一点,但想法是将每个 forloop 查询“保存”在 json 数组或记录数组(我认为不存在)中,然后在循环后从数组中返回一个完整的 json。
【问题讨论】:
【参考方案1】:可能你不需要 LOOP 循环吗?可以使用json_build_object
函数来完成此任务,例如:
CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$
DECLARE
SS json;
BEGIN
select json_agg(j order by (j->>'dia')::date) from (
SELECT json_build_object('dia', office_date, 'Total', count(*) ) as j
from dates
where
office_date in (SELECT date FROM timetable WHERE date<CURRENT_DATE)
group by office_date
) t
into SS;
RETURN SS;
END; $$
LANGUAGE plpgsql;
【讨论】:
以上是关于PLpgSQL:将每条记录存储在 For Loop 中并返回 json的主要内容,如果未能解决你的问题,请参考以下文章
如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?