Использование параметра в качестве имени столбца в функции Postgres - PullRequest
0 голосов
/ 22 января 2020

У меня есть таблица Postgres, имеющая следующую форму

CREATE TABLE "public"."days" 
(
 "id" integer NOT NULL,
 "day" character varying(9) NOT NULL,
 "visits" bigint[] NOT NULL,
 "passes" bigint[] NOT NULL
);

Я хотел бы написать функцию, которая позволяет мне возвращать столбец visits или 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 довольным?

1 Ответ

2 голосов
/ 22 января 2020

Вы не можете использовать параметры в качестве идентификаторов (= имя столбца), для этого вам нужно Dynami c SQL. А для этого требуется, чтобы PL / pg SQL:

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 () правильно обрабатывал идентификаторы при построении динамических c SQL. $1 является заполнителем параметра, значение которого передается с предложением using p_id оператора execute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...