PostgreSQL - 动态值作为表名

Mr.*_*Mr. 21 sql postgresql dynamic-sql postgresql-9.1

可能重复:
Postgres动态查询功能

我希望使用下面查询中返回的字符串作为其他查询的表名.

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')
Run Code Online (Sandbox Code Playgroud)

如你所见,它返回一个字符串.我希望将它用作另一个查询的输入,例如

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup
Run Code Online (Sandbox Code Playgroud)

可以吗?有什么线索怎么样?

Cra*_*ger 42

您需要通过块或PL/PgSQL函数()使用PL/PgSQL EXECUTE语句.PostgreSQL使用的普通SQL方言不支持动态SQL,只能在程序PL/PgSQL变体中使用.DOCREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql

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

format(...)函数%I%L格式指定符做适当的识别符和文字分别引用.

对于文字,我建议使用EXECUTE ... USING而不是format(...)使用%L,但对于像表/列名这样的标识符,格式%I模式是详细quote_ident调用的简洁替代方法.

  • @AndriyM [`format()`](http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER)函数中的`%I`插值占位符对于postgres标识符,将安全地引用提供的值. (3认同)