我想重复以下查询 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(使用前将#替换为@)