如何从具有定制列名称的函数中 return a table?

How do I return a table from a function with a bespoke column name?

此功能有效:

CREATE OR REPLACE FUNCTION public.a()
 RETURNS TABLE(a text)
 LANGUAGE plpgsql
AS $function$
BEGIN
    return query execute
    'select a from ztable';
END;
$function$;

但是当我尝试向列名称添加一些文本时:

CREATE OR REPLACE FUNCTION public.a(prefix text)
 RETURNS TABLE(a text)
 LANGUAGE plpgsql
AS $function$
BEGIN
    return query execute
    'select a as _a from ztable' using prefix;
END;
$function$;

这只是因为 $1 上的语法错误而失败。
或者:

CREATE OR REPLACE FUNCTION public.a(prefix text)
 RETURNS TABLE(a text)
 LANGUAGE plpgsql
AS $function$
BEGIN
    return query execute
    'select a as '||prefix||'_a from ztable';
END;
$function$;

select * from a('some prefix') 无效。
是否有其他一些语法可以完成这项工作?

这根本不可能。 SQL 不允许动态列名。

您必须使用 调用 分配列别名。喜欢:

SELECT a AS prefix_a FROM public.a();

或在直接附加到函数的列定义列表中:

SELECT * FROM public.a() AS f(prefix_a);

或者,在处理 单个 输出列时,甚至只是:

SELECT * FROM public.a() AS prefix_a;

参见: