linux - 通过 bash 脚本运行时 psql 列名不存在

标签 linux bash postgresql psql postgresql-12

我正在尝试在 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/

相关文章:

linux - 脚本只处理输入文件的第一行

c# - Linux Mono 中使用快速彩色文本框的 System.NullReferenceException

bash - 如何检查bash读取是否没有输入?

string - 通过 bash 在 SIFT 上的 "match"循环中连接超过 4 个字符串

linux - awk 没有选择字符串和管道作为分隔符

linux - 在与该服务器断开连接之前,如何成为远程服务器上的 root 用户?

java - 查询不从数据库返回任何内容

sql - PostgreSQL : Use of ANY for multiple values

postgresql - PostgreSQL 是否支持表(片段)的透明压缩?

linux - 使用 sed 或 awk 替换匹配后的行