29

可能重复:
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

可以做到吗?任何线索如何?

4

1 回答 1

57

您将需要通过块或 PL/PgSQL 函数 ( )使用PL/PgSQLEXECUTE语句。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;

format(...)function和format-specifiers 分别进行正确的标识符%I%L文字引用。

对于文字,我建议使用EXECUTE ... USING而不是format(...)with %L,但对于像表/列名称这样的标识符,格式%I模式是冗长quote_ident调用的一个很好的简洁替代方案。

于 2012-11-08T13:33:53.650 回答