是否可以使用postgres COPY将选择从一个表输出到另一个文本字段作为csv

时间:2019-04-11 10:40:21

标签: postgresql

我一直在考虑探索在postgres系统中归档旧数据的选项,但是将其作为表格提供给系统。我目前正在复制到压缩文件中,从gunzkip -k创建外部数据包装程序,然后将其保留。

这可行,虽然有时检索会有点慢,但是会创建很多表,所以我对自己想,由于文件不是太大,该csv可以存储在toast中吗?

在此变得太复杂之前-数据仍然需要有趣的访问方法,并且多表问题仍然需要回答,我确实需要从某个地方开始,因此尝试像这样在表之间运行简单的复制命令

COPY foo_data(data)
FROM (SELECT * FROM foo ORDER BY id WHERE date > now() - interval '6 months')
WITH (
    format csv,
    header true,
    null '',
    delimiter ',',
    quote '"'
)

产生此错误:

ERROR:  syntax error at or near "("
LINE 2: FROM (SELECT * FROM foo ORDER BY id)

让我想知道2件事,是否有一条SQL语句将输出类似于json_agg()的csv,这意味着不需要复制,如果不是这样的话,甚至可以进行表到表的复制,或者将2条复制命令(复制到文件上)磁盘,将新创建的文件复制到其他表)是否可以实现?

1 个答案:

答案 0 :(得分:0)

  

是否存在一条将输出类似于json_agg()的csv的SQL语句

您可以将整行转换为文本,然后输出a textual representation of that row type。例如。

select p::text
from person;

可能返回以下内容:

(1, Foo, Bar)
(2, Some, "Other Name")

哪种格式已经接近“ csv”格式,您只需要删除括号即可,可以使用:substr(p::text, 2, length(p::text) - 2)

使用该方法,您可以执行以下操作:

insert into foo_data(data)
SELECT substr(f::text, 2, length(f::text) - 2)
FROM foo f 
ORDER BY id 
WHERE date > now() - interval '6 months');