我有一个带有以下形式的 Postgres 表
CREATE TABLE "public"."days"
(
"id" integer NOT NULL,
"day" character varying(9) NOT NULL,
"visits" bigint[] NOT NULL,
"passes" bigint[] NOT NULL
);
我想写一个函数,让我返回visits
or the passees
列作为指定的结果id
。我的第一次尝试如下
CREATE OR REPLACE FUNCTION day_entries(INT,TEXT) RETURNS BIGINT[] LANGUAGE sql AS
'SELECT $2 FROM days WHERE id = $1;'
失败并出现以下错误
声明为返回 bigint[] 的函数返回类型不匹配
详细信息:实际返回类型是文本。
如果我输入visits
代替$2
一切都按预期进行。定义多个函数来匹配不同的列是没有意义的days
桌子。有没有办法将实际的列名作为参数传递,同时仍然让 Postgres 满意?
您不能使用参数作为标识符(=列名称),您需要动态 SQL。这需要 PL/pgSQL:
CREATE OR REPLACE FUNCTION day_entries(p_id int, p_column text)
RETURNS BIGINT[]
AS
$$
declare
l_result bigint[];
begin
execute format('SELECT %I FROM days WHERE id = $1', p_column)
using p_id
into l_result;
return l_result;
end;
$$
LANGUAGE plpgsql;
format() https://www.postgresql.org/docs/current/functions-string.html#FUNCTIONS-STRING-FORMAT在构建动态 SQL 时正确处理标识符。这$1
是一个参数占位符,其值通过using p_id
的条款execute
陈述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)