我有一个PostgreSQL查询,我想通过一个循环运行到多个地理区域。我想使用数组中的元素来修改查询和将数据导出到的csv文件的名称。所以本质上,我希望查询在…cwa='MFR'。。。并导出到hourly_MFR.csv,然后在…cwa='PQR'。。。并导出到hourly_PQR.csv,依此类推。
这是我目前所拥有的。我认为脚本中的EOF可能会导致问题,但我无法在保持脚本的通用格式的同时,找到如何使循环工作的方法。
此外,查询/脚本没有循环(不包括declare、for、do、done语句)也可以正常工作。

dbname="XXX"

username="XXXXX"

psql $dbname $username << EOF

declare -a arr=('MFR', 'PQR', 'REV')

for i in "${arr[@]}"

do

\COPY
(SELECT d.woyhh,
      COALESCE(ct.ct, 0) AS total_count
FROM
 (SELECT f_woyhh(d::TIMESTAMP) AS woyhh
  FROM generate_series(TIMESTAMP '2018-01-01', TIMESTAMP '2018-12-31', interval '1 hour') d) d
LEFT JOIN
 (SELECT f_woyhh((TIME)::TIMESTAMP) AS woyhh,
         count(*) AS ct
  FROM counties c
  JOIN ltg_data d ON ST_contains(c.the_geom, d.ltg_geom)
  WHERE cwa = $i
  GROUP BY 1) ct USING (whh)
ORDER BY 1) TO /var/www/html/GIS/ltg_db/bigquery/hourly_$i.csv CSV HEADER;

done

EOF

谢谢你的帮助!

最佳答案

我想你快到了,你只要重新订几行就行了。试试这个:

dbname="XXX"

username="XXXXX"

declare -a arr=('MFR', 'PQR', 'REV')

for i in "${arr[@]}"
do

psql $dbname $username << EOF

\COPY
(SELECT d.woyhh,
      COALESCE(ct.ct, 0) AS total_count
FROM
 (SELECT f_woyhh(d::TIMESTAMP) AS woyhh
  FROM generate_series(TIMESTAMP '2018-01-01', TIMESTAMP '2018-12-31', interval '1 hour') d) d
LEFT JOIN
 (SELECT f_woyhh((TIME)::TIMESTAMP) AS woyhh,
         count(*) AS ct
  FROM counties c
  JOIN ltg_data d ON ST_contains(c.the_geom, d.ltg_geom)
  WHERE cwa = $i
  GROUP BY 1) ct USING (whh)
ORDER BY 1) TO /var/www/html/GIS/ltg_db/bigquery/hourly_$i.csv CSV HEADER;

EOF

done

declarefor循环是bash脚本的一部分,而<<EOFEOF之间的所有内容都是Postgresql查询的一部分。

关于bash - 无法遍历bash中的数组以进行PostgreSQL查询导出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50428121/

10-11 22:37
查看更多