【问题标题】:PostgreSQL - dynamic value as table name [duplicate]PostgreSQL - 作为表名的动态值[重复]
【发布时间】: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

可以吗?有什么线索吗?

【问题讨论】:

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

标签: sql postgresql postgresql-9.1 dynamic-sql


【解决方案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:哦,很好,谢谢。那么好的解决方案,克雷格! (显然:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2011-01-28
  • 2014-02-20
相关资源
最近更新 更多