PostgreSQL - 动态值作为表名

35

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

可以做到吗?有什么线索吗?


我有一个解决方案,不适用于https://dev59.com/b2gv5IYBdhLWcg3wYv2i,但对于这个问题很有趣:SELECT '"backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd') || '"' AS tname; \gsetCREATE TABLE :tname AS SELECT * FROM backup; - Roman Tkachuk
1个回答

63
你需要使用PL/PgSQL EXECUTE 语句,通过 DO 块或 PL/PgSQL 函数 (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql)。 PostgreSQL 中只支持过程化的 PL/PgSQL 变体,不支持普通 SQL 方言中的动态 SQL。
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调用的一个简洁替代方案。

1
如果名称包含特殊字符,它会自动加引号吗?我不是很了解PostgreSQL,但似乎一个简单的格式化函数并不聪明到可以做到这一点。 - Andriy M
3
%I插值占位符在format()函数中专门用于PostgreSQL标识符,并且会安全地引用所提供的值。 - dbenhur
@dbenhur:哦,好的,谢谢。那么,这是个不错的解决方案,克雷格!(显然 :) - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接