Greenplum查询结果导出CSV多行及表名传参问题求助
解决Greenplum导出多行CSV并传入表名参数的问题
我来帮你分析下问题所在,然后给出可行的解决方案:
为什么你的第一个命令只导出一行?
你原来的命令把psql的输出赋值给了变量r,而shell在处理反引号(`)的输出时,会自动把所有换行符替换成空格,最终变量r里的内容是所有查询结果连在一起的一行,重定向到文件自然就只有一行了。解决这个问题的核心是不要通过中间变量传递输出,直接让psql的标准输出直接写入文件。
正确的导出命令(支持表名参数)
方法1:保留Here-Doc写法(更易读,适合复杂SQL)
把变量赋值去掉,直接让psql的输出重定向到文件,同时确保Here-Doc的分隔符不带引号(这样变量才能正确展开):
#!/bin/bash # 定义参数变量 hostname="your_gp_host" username="your_username" dbname="your_db" gschema="target_schema" gtable="target_table" key="sort_key_column" # 直接导出到CSV,不经过中间变量 psql -A -t -q -h "$hostname" -U "$username" -d "$dbname" <<-THE_END > /home/gp.csv COPY(select * From ${gschema}.${gtable} order by ${key} limit 3) TO STDOUT WITH (FORMAT CSV, NULL ' ', DELIMITER ',', HEADER); THE_END
方法2:使用psql -c选项(更简洁)
如果SQL语句不复杂,也可以用-c参数直接传递SQL,同样支持变量展开:
#!/bin/bash hostname="your_gp_host" username="your_username" dbname="your_db" gschema="target_schema" gtable="target_table" key="sort_key_column" psql -A -t -q -h "$hostname" -U "$username" -d "$dbname" \ -c "COPY(select * From ${gschema}.${gtable} order by ${key} limit 3) TO STDOUT WITH (FORMAT CSV, NULL ' ', DELIMITER ',')" \ > /home/gp.csv
关键注意事项
- 变量展开的前提:Here-Doc的分隔符(比如
THE_END)不要加单引号,如果写成<<-'THE_END',shell会关闭变量替换,导致表名参数无法传入。 - 引号包裹变量:把
$hostname、$username等变量用双引号包裹("$hostname"),避免当变量值包含空格或特殊字符时出现错误。 - CSV格式优化:我在示例里加了
FORMAT CSV、DELIMITER ','等选项,让输出更标准的CSV格式;如果需要导出表头,可以加上HEADER参数。
这样修改后,既能正确导出多行查询结果,又能通过变量传入表名、schema等参数。
内容的提问来源于stack exchange,提问作者smylie panda
相关产品推荐
相关产品推荐

