PostgreSQL - 作为表名的动态值[重复]

Posted

技术标签:

【中文标题】PostgreSQL - 作为表名的动态值[重复]【英文标题】:PostgreSQL - dynamic value as table name [duplicate] 【发布时间】:2012-10-28 15:57:38 【问题描述】:

可能重复:Postgres Dynamic Query Function

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

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

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

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

可以吗?有什么线索吗?

【问题讨论】:

我的解决方案不适用于***.com/questions/10639963/…,但对这个问题很感兴趣:SELECT '"backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd') || '"' AS tname ; \gset CREATE TABLE :tname AS SELECT * FROM backup; 【参考方案1】:

您需要通过DO 块或PL/PgSQL 函数(CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql) 使用PL/PgSQL EXECUTE statement。 PostgreSQL 使用的普通 SQL 方言不支持动态 SQL,仅在过程 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(...) function 的 %I%L 格式说明符分别执行正确的标识符和文字引用。

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

【讨论】:

如果名称包含特殊字符,会自动引用吗?我不是一个真正的 PostgreSQL 用户,但一个简单的 FORMAT() 函数是否足够聪明来做到这一点似乎值得怀疑。 @AndriyM format() 函数中的 %I 插值占位符专门用于 postgres 标识符,并将安全地引用提供的值。 @dbenhur:哦,很好,谢谢。那么好的解决方案,克雷格! (显然:)

以上是关于PostgreSQL - 作为表名的动态值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中动态分析给定模式名和表名的元数据?

postgresql哪个语句可以改变字段名的类型?alert table 表名 alter column 字段名 字段类型 这个是不行的

具有动态表名的 Oracle Select 查询

用SQL profiler工具抓指定表名的动态

在 PL/SQL 过程中打开动态表名的游标

PostgreSQL 动态列选择