4

結果として常に 1 つの要素のみを返すクエリがあります。このクエリの結果を、さらに処理するために使用できる文字列に追加したい

select id from ids where some_condition

この ID を文字列に追加したい

のようresult_(id)_tableに、id は前のクエリから返された id に置き換える必要があります (これは本質的に別のテーブルです)

最後に、次のようなクエリを実行できるはずです

select * from result_id_table

ここで、「result_id_table」は、id が適切に置換されたテーブルの名前です。

4

2 に答える 2

9

文字列連結を使用します。

-- Demo table structure
CREATE TABLE dummy ( id integer primary key, blah integer not null);
INSERT INTO dummy(id, blah) VALUES (1,1);

-- Single-valued query
SELECT id FROM dummy WHERE blah = 1;

-- Formatted with string concatenation
SELECT 'result_'||(id::text)||'_table' FROM dummy WHERE blah = 1;

-- Formatted using the `format` function
SELECT format('result_%s_table', id) FROM dummy WHERE blah = 1;

他の情報を収集している場合は、サブクエリを使用して文字列に結合します

SELECT 'result_'||(SELECT id FROM dummy WHERE blah = 1)||'_table'
FROM .... WHERE ...

または結合を使用します。

あなたの編集は、それをテーブル名として使用することを示唆しています。これはおそらく、あなたのデザインが悪いことを意味します。それ以外の:

CREATE TABLE sometable_1 ( id integer primary key, ...);
CREATE TABLE sometable_2 ( id integer primary key, ...);
CREATE TABLE sometable_3 ( id integer primary key, ...);
...
CREATE TABLE sometable_n ( id integer primary key, ...);

ほとんどの場合、次のほうが良いでしょう:

CREATE TABLE sometable(
     id integer not null,
     discriminator integer not null,
     primary key (id, discriminator),
     ...
);

またはスキーマごとのテーブル。何らかの理由でこのアプローチに行き詰まっている場合は、次のように PL/PgSQL のEXECUTEステートメントを使用して動的 SQL を実行できます。

EXECUTE format('SELECT * FROM sometable_%s WHERE blah = ?', 
            quote_ident((SELECT id FROM dummy WHERE blah = 1))
        )
USING 2;

「blah = 2」の行について「sometable_1」を照会します。詳細については、マニュアルを参照してくださいEXECUTE ... USING

PostgreSQL の通常の SQL でこれを行うことはまったく不可能です。アプリケーションまたは PL/PgSQL で実行します。PL/PgSQLDOブロックを使用することもできますが、すべてに依存しているとパフォーマンスが低下します

手遅れになる前に、今すぐデザインを修正してください。

于 2012-10-08T07:56:50.253 に答える
1

Redshift で Postgres を使用していますが、etl で動的な日付を使用しようとすると問題が発生し、解決策が見つかりました。

変数の値を使用する 1 つの正しい方法は、次のf' 'とおりです。

query = f''' select * from table where date >= '{my_date}' order by date '''

text免責事項: これは安全な解決策ではありませんが、 sqlalchemyおよびbindparam--- Docs on sqlalchemyを使用するように変更できます。

于 2018-10-31T00:17:43.407 に答える