0

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;"

私が得ているエラー:

エラー: 列 h.idx が存在しません LINE 1: ...M table_a h JOIN table_b b ON h.IDX = b....

4

2 に答える 2

1

シェル スクリプトは二重引用符を送信しません。あなたはこれを持っています:

"\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;"

また、すべて大文字にすることや、特定のケースを強制することは避けることをお勧めします。必要に応じて、大文字を入力することもできます。引用符で囲まれた列名を使用するのは、最終的なクエリをよりきれいにフォーマットするためだけです。

于 2019-11-09T05:15:45.777 に答える