【问题标题】:Concatenate date in a string [duplicate]在字符串中连接日期[重复]
【发布时间】:2012-01-23 19:00:09
【问题描述】:

可能重复:
Dynamically-generated table-name in PostgreSQL COPY command

我在 postgresql 中使用了复制到文件功能,效果很好。

当前代码如下所示

COPY table 
TO 'filename.txt'

这很好用,但我想在文件名中添加日期。

所以我尝试了

COPY table 
TO 'filename' || CURRENT_DATE || '.txt'

没有成功。

我也试过把它放在查询中

COPY table 
TO (select 'filename' || CURRENT_DATE || '.txt')

有人愿意帮我吗?

编辑

认为问题是,函数COPY TO 需要一个字符串作为目标。然后我输入一个查询,返回一个结果集......

【问题讨论】:

  • “没有成功”是什么意思?有错误信息吗?
  • 其实我是在一个pgAgent作业中运行的,只能看查询是运行成功还是失败。
  • 当前日期将包含 2012 年 12 月 19 日。许多操作系统不支持文件名中的 /。也许您需要以不同的方式格式化日期,以便不包括 /。
  • 我投票赞成 Kublai Khan 链接到的问题,但后来我意识到这个问题实际上是关于动态生成的 table-name 而不是 文件名。 (我已将该问题编辑得更清楚。)鉴于这种差异,我不确定合并这些问题是否有意义:它们具有相同的解决方案,但出于不同的原因。
  • @ruakh - 您对问题之间的区别是正确的,感谢您注意到这一点。这可能不应该关闭。

标签: sql postgresql concatenation


【解决方案1】:

正如您所怀疑的,问题在于 PostgreSQL 需要一个字符串文本文件名,格式为 'filename'E'filename',而不是生成文件名为 @987654325 的表达式(例如子查询) @ 或 text 或诸如此类。据我所知,唯一的解决方法是动态生成整个COPY 语句,并使用the EXECUTE command 在PL/pgSQL 中运行它。你可以像这样创建一个函数:

CREATE OR REPLACE FUNCTION copy_table_to_file(filename TEXT) RETURNS VOID AS
$$
  BEGIN
    EXECUTE 'COPY table TO ''' || filename || '''';
  END;
$$ LANGUAGE 'plpgsql';

然后像这样调用它:

SELECT copy_table_to_file('filename' || CURRENT_DATE || '.txt');

几点说明:

  • 如果需要,您也可以将表名设置为参数。
  • 从上面链接的文档可以看出,EXECUTE 命令支持USING 子句传入数据;但我刚刚测试过,似乎EXECUTE 'COPY table TO $1' USING filename; 之类的东西 not 工作。我认为这与您的原始问题或多或少的原因相同:文件名必须指定为字符串文字,而不是替换参数。因此,请小心您传递给函数的filename,并确保它不包含任何单引号或反斜杠或诸如此类的东西,否则您会不小心对自己执行 SQL 注入攻击。
  • 您可能对这个之前的相关问题感兴趣:Dynamically-generated table-name in PostgreSQL COPY command

【讨论】:

  • +1 好答案。顺便说一句,我注意到这最终会关闭。如果您也愿意,我投票决定重新开放。令人困惑的情况:\
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多