在字符串中连接日期

时间:2011-12-19 17:11:08

标签: sql postgresql concatenation

  

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

我在postgresql中使用copy to file函数,效果很好。

当前代码如下所示

COPY table 
TO 'filename.txt'

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

所以我试过

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

没有成功。

我也尝试将其放入查询

COPY table 
TO (select 'filename' || CURRENT_DATE || '.txt')
是谁愿意帮助我?

修改

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

1 个答案:

答案 0 :(得分:3)

正如您所怀疑的那样,问题是PostgreSQL期望以'filename'E'filename'形式的字符串文字文件名,而不是生成一个表达式(如子查询)文件名为varchartext或诸如此类的。据我所知,唯一的解决方法是动态生成整个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;之类的内容 不起作用。我认为这与原始问题的原因大致相同:文件名必须指定为字符串文字,而不是替换参数。所以,要小心你传入函数的filename,并确保它永远不会包含任何单引号或反斜杠或诸如此类的东西,否则你会不小心对自己执行SQL注入攻击。
  • 您可能对之前的相关问题感兴趣:Dynamically-generated table-name in PostgreSQL COPY command