如何使用psql命令行将多个FOR循环结果远程保存到远程客户端文件?

时间:2017-03-12 03:29:55

标签: postgresql psql

我有一个匿名函数,在FOR循环中包含一个执行100次的查询,我需要将100个结果集保存为远程客户端上的100个文件(不是在服务器上)。

似乎psql \copy元命令应该是这样做的方式,但我不知所措。这种形式的东西,也许?

\copy (anonymous_function_w/_FOR_loop_here) to 'filename.txt'

其中 filename.txt 是在每次迭代中根据FOR循环变量的值构建的。这很重要 - 远程客户端上的文件需要根据FOR循环的变量命名。

有没有办法解决这个问题?我想另一种方法是将UNION所有100个查询结果转换成一个大结果,在一个字段中使用FOR循环的变量值,然后使用bash脚本将其拆分为100个适当命名的文件。但是我的bash技能非常蹩脚。如果psql可以直接完成这项工作,那就太好了。

编辑:我应该补充说这是FOR循环变量的样子:

FOR rec IN SELECT DISTINCT county FROM voter.counties

所以文件名将从rec.county +'。txt'

构建

1 个答案:

答案 0 :(得分:1)

这种方法的典型方法是使用生成必要语句的SQL语句,将输出假脱机到脚本文件中,然后运行该文件。

类似的东西:

-- prepare for a "plain" output without headers or something similar
\a
\t 

-- spool the output into export.sql
\o export.sql
select format('\copy (select * from some_table where county = %L) to ''%s.txt''', county, county)
from (select distinct county from voter.counties) t;

-- turn spooling off
\o 

-- run the generated file
\i export.sql

因此,对于voters.counties中的每个县名,export.sql将包含:

\copy (select * from some_table where county = 'foobar') to 'foobar.txt'