我正在尝试在 bash 脚本中运行多个 sql 语句。我尝试在 psql 上运行以下语句,它工作正常。但是,当我在脚本上运行确切的语句时,它说该列不存在。
声明
\copy (SELECT * FROM table_a h JOIN table_b b ON h."IDX" = b."IDX" WHERE b."XXX" BETWEEN 0 AND 100) to 'D:\$path\onetry1.csv' with csv HEADER;
我知道在 Postgres 中,需要在大写列名上使用双引号。我做到了。
这是我的 bash 脚本:
#! /bin/sh
db="usm"
PGPASSWORD=XXX123 psql -h localhost -U postgres -d $db -c "\copy (SELECT * FROM table_a h JOIN table_b b ON h."IDX" = b."IDX" WHERE b."XXX" BETWEEN 0 AND 500) to '$path\onetry2.csv' with csv HEADER;"
我得到的错误:
ERROR: column h.idx does not exist LINE 1: ...M table_a h JOIN table_b b ON h.IDX = b....
最佳答案
您的 shell 脚本不发送双引号。你有这个:
"\copy (SELECT * FROM table_a h JOIN table_b b ON h."IDX" = b."IDX" WHERE b."XXX" BETWEEN 0 AND 500) to '$path\onetry2.csv' with csv HEADER;"
它本质上是作为以下字符串的串联
"\copy (SELECT * FROM table_a h JOIN table_b b ON h."
IDX
" = b."
IDX
" WHERE b."
XXX
" BETWEEN 0 AND 500) to '$path\onetry2.csv' with csv HEADER;"
但是 PostgreSQL 永远看不到双引号。使用反斜杠转义嵌套的双引号:
"\copy (SELECT * FROM table_a h JOIN table_b b ON h.\"IDX\" = b.\"IDX\" WHERE b.\"XXX\" BETWEEN 0 AND 500) to '$path\onetry2.csv' with csv HEADER;"
此外,更愿意避免强制所有大写或任何特定的大小写。如果需要,您仍然可以输入大写字母。我仅使用带引号的列名来格式化最终查询。
关于linux - 通过 bash 脚本运行时 psql 列名不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58776542/