文字列連結を使用します。
-- 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
ブロックを使用することもできますが、すべてに依存しているとパフォーマンスが低下します。
手遅れになる前に、今すぐデザインを修正してください。