Вы не можете использовать переменные для элементов схемы, такие как имена таблиц и столбцов в sql, но вы можете построить запрос (как текст) в функции plpgsql и выполнить его с помощью оператора EXECUTE (как указано @ user3222580)
Это пример. Я строю запрос и возвращаю результат как ТАБЛИЦУ. Вы должны определить структуру данных, которые вы хотите вернуть в части RETURNS.
Я попытался воспроизвести ваш тестовый пример, но я не уверен, что функция действительно нужна, вам нужно. Возьмите его как образец кода. Я перебираю записи в «статьях» таблицы и беру значение столбца «column_name» для построения запроса SELECT ... UNION SELECT.
CREATE OR REPLACE FUNCTION test_function() RETURNS TABLE (a_id int, cf_id int) as
$$
DECLARE _column_name text; _query text; counter int;
BEGIN
_query = '';
counter = 0;
FOR _column_name in SELECT column_name FROM custom_field LOOP
IF counter > 0 THEN
_query = _query || ' UNION ';
END IF;
_query = _query ||'select
a.id,
cf.id
from
custom_field cf
inner join
article a
on
'||_column_name||' is not null and
'||_column_name||'::integer > 0';
counter = counter+ 1;
END LOOP;
raise info '%', _query;
RETURN QUERY EXECUTE _query;
END;
$$
language plpgsql;
Так вы можете вызвать функцию:
SELECT * from test_function();
Вы должны использовать "RETURN QUERY ВЫПОЛНИТЬ", как [здесь] [1] [1]: HTTP: // StackOverflow .com/вопросы/21619189/как к нарисуй стол-с-динамического идентификатора-в-Postgres –