在 Postgres 函数中使用参数作为列名

2024-04-06

我有一个带有以下形式的 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(使用前将#替换为@)

在 Postgres 函数中使用参数作为列名 的相关文章

随机推荐