plpgsql For循环中的Select语句创建多个CSV文件

2024-01-11

我想重复以下查询 8760 次,将一年中每个小时的“2”替换为 1 到 8760。我们的想法是每小时创建一个单独的 CSV 文件以进行进一步处理。

COPY 
(SELECT *
FROM 
  public.completedsolarirad2012
WHERE 
  completedsolarirad2012."UniquetmstmpID" = 2)
TO 'C:\temp\2012hour2.csv' WITH DELIMITER ','
CSV HEADER

我整理了以下功能(仅用几个小时进行测试):

CREATE OR REPLACE FUNCTION everyhour()
  RETURNS void AS
$BODY$BEGIN
FOR i IN 0..5 LOOP
  EXECUTE $x$ 
  COPY (
    SELECT *
    FROM 
    public.completedsolarirad2012
    WHERE 
    completedsolarirad2012."UniquetmstmpID" = i
    )
   TO $concat$ 'C:\temp.' || i::text 
         || '.out.csv' WITH DELIMITER ',' CSV HEADER $concat$
    $x$;
END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION everyhour()
  OWNER TO postgres;

我似乎有两个不同的问题:

首先,我得到:

错误:列“i”不存在。

其次,当我仅通过将“i”替换为例如来测试串联语句时, “2”,我得到:

错误:不允许使用相对路径复制到文件

我是 postgres 超级用户,所以我不明白为什么会遇到这个问题。

注意:删除$concat$连接语句周围的双引号会产生以下错误:

ERROR:  syntax error at or near "||"
LINE 9:    TO 'C:\temp.' || i::text

我将非常感谢任何帮助。


假设您的服务器操作系统是Windows。

CREATE OR REPLACE FUNCTION everyhour()
  RETURNS void AS
$func$
BEGIN
FOR i IN 0..5 LOOP
   EXECUTE '
   COPY (
      SELECT *
      FROM   public.completedsolarirad2012 c
      WHERE  c."UniquetmstmpID" = ' || i || $x$)
   TO 'C:/temp.'$x$ || i || $x$'.out.csv' WITH DELIMITER ',' CSV HEADER$x$;
END LOOP;
END
$func$  LANGUAGE plpgsql;
  • 你的一层美元报价太多了。
  • 您还意外地连接了字母“i”而不是它的值。
  • 即使对于 Windows,也使用正斜杠。或者,您可能必须将反斜杠加倍,具体取决于您的设置。更多相关答案:
    PostgreSQL:将 SQL 查询的结果数据导出到 Excel/CSV https://stackoverflow.com/questions/8119297/postgresql-export-resulting-data-from-sql-query-to-excel-csv/8119342#8119342

更简单的是format() http://www.postgresql.org/docs/current/interactive/functions-string.html#FUNCTIONS-STRING-FORMAT

从 Postgres 9.1 开始你可以使用format() http://www.postgresql.org/docs/current/interactive/functions-string.html#FUNCTIONS-STRING-FORMAT简化复杂的串联:

CREATE OR REPLACE FUNCTION everyhour()
  RETURNS void AS
$func$
BEGIN
FOR i IN 0..5 LOOP
   EXECUTE format($x$COPY (
   SELECT *
   FROM   public.completedsolarirad2012 c
   WHERE  c."UniquetmstmpID" = %1$s)
   TO 'C:/temp.%1$s.out.csv' WITH DELIMITER ',' CSV HEADER$x$, i);
END LOOP;
END
$func$  LANGUAGE plpgsql;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

plpgsql For循环中的Select语句创建多个CSV文件 的相关文章

随机推荐