33

動的 SQL を使用して postgres でいくつかのクエリを実行しようとしていました。

例:

EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)))

result_%s_table という形式のテーブルをクエリする必要があり、別のテーブルから正しいテーブル名 (ID) に置き換える必要があります。

エラーが発生しますERROR: prepared statement "format" does not exist

リンク:クエリ結果 postgresql による文字列置換

4

5 に答える 5

40

EXECUTE ... USINGPL/PgSQLでのみ機能します。つまり、PL/PgSQL 言語で記述された関数またはDOブロック内です。プレーン SQL では機能しません。プレーン SQL は、EXECUTE準備されたステートメントを実行するため、完全に異なります。動的 SQL を PostgreSQL の SQL ダイアレクトで直接使用することはできません。

比較:

前の回答の最後の 2 番目のパーを参照してください。


PL/PgSQL 以外で実行されないことに加えて、SQL ステートメントが間違っているため、期待どおりに動作しません。(select id from ids where condition = some_condition)が say を返す場合、 が整数の42場合、ステートメントは失敗します。idテキストにキャストすると、次のようになります。

EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';

それは無効です。あなたは実際にresult_42_tableまたはしたいです"result_42_table"。次のようなものを書く必要があります。

EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))

... を使用する必要がある場合quote_ident

于 2012-10-08T10:59:01.470 に答える
1

これらはすべて、OP の質問よりも複雑に見えます。別のフォーマットでうまくいくはずですが、私には理解できない場合があります。

OPの質問をどのように読んだかから、同様の状況にある他の人は、私がそれをどのように得たかから恩恵を受けるかもしれないと思います.

Redshift で Postgre を使用していますが、この問題に遭遇して解決策を見つけました。

自分の日付を入れて、動的クエリを作成しようとしていました。

date = dt.date(2018, 10, 30)

query = ''' select * from table where date >= ''' + str(my_date) + ''' order by date '''

ただし、このように入力すると、クエリは条件を完全に無視します。

ただし、パーセント記号 (%) を使用すると、日付を正しく挿入できます。

上記のステートメントの正しい書き方の 1 つは、次のとおりです。

query = ''' select * from table where date >= ''' + ''' '%s' ''' % my_date + ''' order by date '''

したがって、これは役立つ場合もあれば、そうでない場合もあります。私の状況で少なくとも1人の人に役立つことを願っています!

幸運をお祈りしています。

于 2018-10-31T00:22:07.263 に答える
0

EXECUTE pl/pqsql環境でのみ機能します。

EXECUTEの代わりにSELECTを試してください

 SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))

出力は動的クエリになります。

于 2012-10-08T11:06:38.700 に答える