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() 函数是否足够聪明来做到这一点似乎值得怀疑。 @AndriyMformat()
函数中的 %I
插值占位符专门用于 postgres 标识符,并将安全地引用提供的值。
@dbenhur:哦,很好,谢谢。那么好的解决方案,克雷格! (显然:)以上是关于PostgreSQL - 作为表名的动态值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
postgresql哪个语句可以改变字段名的类型?alert table 表名 alter column 字段名 字段类型 这个是不行的