Supabase提取表数据输出JSON问题:函数仅返回单行
解决Supabase函数返回单行JSON的问题
你的函数只返回单行数据,核心原因是用INTO datas将查询结果存入单个record变量,这种变量只能存储一行数据,自然只会返回第一行的结果。
以下是两种修正方案,同时补上你原本遗漏的日期过滤逻辑(传入的start_date和end_date参数之前未被使用):
方案1:简化为SQL函数(推荐)
SQL函数比PL/pgSQL更简洁高效,适合这类数据查询场景:
CREATE OR REPLACE FUNCTION get_dashboard_company_registration(start_date date, end_date date) RETURNS JSON AS $$ SELECT json_build_object( 'data', json_agg( json_build_object( 'id', p.id, 'plan_name', p.plan_name, 'created_at', pr.created_at, 'count', count(p.id) ) ) ) FROM profiles as pr JOIN user_subscription_plans as usp ON usp.user_id = pr.id JOIN plans as p ON usp.plans_id = p.id WHERE pr.created_at BETWEEN start_date AND end_date + INTERVAL '1 day' GROUP BY p.id, p.plan_name, pr.created_at ORDER BY pr.created_at; $$ LANGUAGE sql security definer;
方案2:修正PL/pgSQL版本
如果坚持使用PL/pgSQL,只需将单个record变量替换为聚合后的JSON对象:
CREATE OR REPLACE FUNCTION get_dashboard_company_registration(start_date date, end_date date) RETURNS JSON AS $$ DECLARE jsondata JSON; BEGIN SELECT json_build_object( 'data', json_agg( json_build_object( 'id', p.id, 'plan_name', p.plan_name, 'created_at', pr.created_at, 'count', count(p.id) ) ) ) INTO jsondata FROM profiles as pr JOIN user_subscription_plans as usp ON usp.user_id = pr.id JOIN plans as p ON usp.plans_id = p.id WHERE pr.created_at BETWEEN start_date AND end_date + INTERVAL '1 day' GROUP BY p.id, p.plan_name, pr.created_at ORDER BY pr.created_at; RETURN jsondata; END; $$ LANGUAGE plpgsql security definer;
关键说明
- 使用
json_agg()函数将查询返回的所有行聚合为一个JSON数组,确保所有数据都被包含在返回结果中 - 添加
WHERE子句过滤created_at在指定日期范围内的数据(end_date + INTERVAL '1 day'是为了包含end_date当天的所有时间点) - 返回的结构为
{"data": [{}, {}, ...]}格式,符合FlutterFlow后续处理的JSON结构需求
内容的提问来源于stack exchange,提问作者goaty
相关产品推荐
相关产品推荐

