首页 > 解决方案 > 如何从 postgresql 导出多个 csv 文件以进行循环查询?

问题描述

我有 100 个州代码。我需要在这样的查询中使用它们:

select *
from public.clients
where state = '01'

并获得 100 个不同的 .csv 文件。我没有超级用户权限,所以如果我做对了,我只能\copy在 psql 命令行中完成。但我不明白如何正确使用它。

我试着让它像这样:

DO
$do$
declare
    i   text;
    arr text[] := array(
                    select distinct state
                    from public.clients c 
                    where state is not null
                    order by state);
BEGIN
   FOREACH i IN ARRAY arr
   LOOP
        EXECUTE format($x$\COPY (
   SELECT *
   FROM   public.clients c 
   WHERE  c."state" = %1$s)
   TO 'G:\Desktop\states\.%1$s.out.csv' WITH DELIMITER ',' CSV HEADER$x$, i);
   END LOOP;
END
$do$

但我得到了ERROR: syntax error at or near "\",我认为这不是最后一个错误,因为我不确定这个WHERE c."state" = %1$s和这个TO 'G:\Desktop\states\.%1$s.out.csv' WITH DELIMITER ',' CSV HEADER$x$, i);

标签: postgresqlpsql

解决方案


DO 将其程序发送到服务器以运行。由于\copypsql元命令,服务器将不知道如何运行它。所以你不能这样做。

您也不能使用元\gexec命令,因为它只能用于运行 SQL 命令,而不是其他元命令。

因此,您可以编写一个脚本(例如,perl 或 python,或 bash)来打印出一系列\copy...然后将其通过管道输入psql,或将其发送到文件并执行psql -f file.sql


推荐阅读