【问题标题】:Postgresql: prepared statements in loop with date as parameterPostgresql:以日期为参数的循环中准备好的语句
【发布时间】:2016-09-25 19:16:17
【问题描述】:

我有三个准备好的语句,它们从不同的表(多个选择语句 + 连接 + 子查询)到给定日期创建表,然后连接两个准备好的语句的结果,即:

CREATE TABLE _table1 AS
EXECUTE statement1('2000-01-01 00:00:00');

CREATE TABLE _table2 AS
EXECUTE statement2('2000-01-01 00:00:00');

CREATE TABLE _table3 AS
EXECUTE statement3('2000-01-01 00:00:00');

CREATE TABLE _table_all AS
SELECT *
FROM _table1
LEFT JOIN
_table3
ON _table1.var1 = _table3.var1;

Statement3 建立在 statement2 = select from _table2 之上(分开以使其更具可读性)。

我想做的是:

  1. 对几个日期执行相同的代码 -> 将日期作为参数传递
  2. 保存最终表:_table_all as _table_2000-01-01, _table_2000-02-01 itd。

我不知道如何制作这样一个循环/函数来创建表并将表名和日期作为参数传递。

预期结果:

FOR my_date IN ('2000-01-01 00:00:00', '2001-01-01 00:00:00', '2002-01-01 00:00:00'):

CREATE TABLE _table1 AS
EXECUTE statement1(@my_date);

CREATE TABLE _table2 AS
EXECUTE statement2(@my_date);

CREATE TABLE _table3 AS
EXECUTE statement3(@my_date);

CREATE TABLE _table_@my_date AS
SELECT *
FROM _table1
LEFT JOIN
_table3
ON _table1.var1 = _table3.var1;

DROP TABLE _table1;
DROP TABLE _table2;
DROP TABLE _table3;

有什么帮助吗?

【问题讨论】:

    标签: postgresql function for-loop


    【解决方案1】:

    postgres 中有两种不同形式的EXECUTE

    • 过程 PL/PgSQL 语言的 EXECUTE,如下所述:

    https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

    • 准备好的语句的EXECUTE,作为独立的 SQL 语句(不依赖于过程语言),如下所述:

    https://www.postgresql.org/docs/current/static/sql-execute.html

    第一个符合您的目的(动态 SQL),而不是第二个。我怀疑您是通过查找有关EXECUTE 并遵循错误的线索而导致准备好的陈述。准备好的语句在您的上下文中没有用。

    有关相关问答,请参阅dynamic sql query in postgres,通常您会在 stackoverflow 或网络上的其他地方找到动态 SQL 的示例。例如,分区代码往往看起来像您所追求的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多