使用字符串连接:
-- 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/PgSQLEXECUTE
运行动态 SQL 的语句,例如:
EXECUTE format('SELECT * FROM sometable_%s WHERE blah = ?',
quote_ident((SELECT id FROM dummy WHERE blah = 1))
)
USING 2;
查询“sometable_1”中“blah = 2”的行。手册中的更多信息,请参见EXECUTE ... USING http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN.
在 PostgreSQL 的常规 SQL 中根本不可能做到这一点。在应用程序或 PL/PgSQL 中执行此操作。 PL/PgSQLDO
可以使用块,但性能会下降awful如果你一切都依赖它。
立即修复您的设计,以免为时已晚。