我有一个匿名函数,在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'
构建答案 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'