如何修改PostgreSQL函数使返回结果拆分为独立多列而非单行复合值
解决PostgreSQL函数返回复合单列而非独立列的问题
你的函数定义本身符合多列返回要求,问题出在调用方式上,以下是具体解决方法:
方法1:纠正调用语法(无需修改函数)
不要直接用SELECT调用函数,而是将其当作表来查询,就能得到独立的三列:
SELECT * FROM vehicle.sp_get_bodytypes_count_by_category();
如果只需要特定列,也可以指定列名:
SELECT intersecting_rows, category_name FROM vehicle.sp_get_bodytypes_count_by_category();
方法2:(可选)显式定义返回类型(函数层面调整)
原函数的RETURNS TABLE定义是正确的,你也可以显式创建复合类型让返回结构更清晰,修改后的函数如下:
-- 先创建自定义复合类型 CREATE TYPE vehicle.bodytype_count_result AS ( intersecting_rows bigint, category_id bigint, category_name text ); -- 重新创建函数,使用自定义类型作为返回集合 CREATE OR REPLACE FUNCTION vehicle.sp_get_bodytypes_count_by_category() RETURNS SETOF vehicle.bodytype_count_result LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE ROWS 1000 AS $BODY$ BEGIN RETURN QUERY SELECT COUNT(*) AS intersecting_rows, category.category_id, category.category_name::text FROM vehicle.category INNER JOIN vehicle.bodytype ON bodytype.category_id = category.category_id GROUP BY category.category_id, category.category_name ORDER BY category.category_id; END; $BODY$; ALTER FUNCTION vehicle.sp_get_bodytypes_count_by_category() OWNER TO postgres;
注意:即使修改了函数,依然需要使用SELECT * FROM ...的语法调用才能得到独立列,直接SELECT vehicle.sp_get_bodytypes_count_by_category()还是会返回复合单列。
内容的提问来源于stack exchange,提问作者Jaishree Epili VESIT
相关产品推荐
相关产品推荐

