我一直在考虑探索在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条复制命令(复制到文件上)磁盘,将新创建的文件复制到其他表)是否可以实现?
答案 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');