PostgreSQL - динамическое значение как имя таблицы

Возможный дубликат:
Функция динамического запроса Postgres

Я хочу использовать возвращаемую строку из запроса ниже как имя таблицы для другого запроса.

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')

как вы можете видеть, он возвращает строку. Я хочу использовать его как вход для другого запроса, например.

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup

Можно ли это сделать? Любая подсказка как?

Ответ 1

Вам нужно будет использовать инструкцию PL/PgSQL EXECUTE через блок DO или PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql). Динамический SQL не поддерживается на обычном диалекте SQL, используемом PostgreSQL, только в процедуре PL/PgSQL.

DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;

format(...) функция %I и %L спецификаторы форматирования выполняют соответствующий идентификатор и буквенное цитирование, соответственно.

Для литералов я рекомендую использовать EXECUTE ... USING вместо format(...) с %L, но для идентификаторов, таких как имена таблиц и столбцов, шаблон формата %I является красивой кратким альтернативой подробным вызовам quote_ident.