字符串替换查询结果postgresql

pst*_*elk 2 postgresql psql

我有一个查询,它总是只返回一个元素.我想将此查询的结果附加到一个字符串中,我可以将其用于进一步处理

select id from ids where some_condition

我想在字符串中附加此id

喜欢result_(id)_table,在哪里,id必须用从前一个查询返回的id替换(这是另一个表的本质)

最后,我应该能够执行像这样的查询

select * from result_id_table
Run Code Online (Sandbox Code Playgroud)

其中,"result_id_table"是id被适当替换的表的名称

Cra*_*ger 6

使用字符串连接:

-- 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;
Run Code Online (Sandbox Code Playgroud)

如果您正在收集其他信息,请使用子查询合并为字符串

SELECT 'result_'||(SELECT id FROM dummy WHERE blah = 1)||'_table'
FROM .... WHERE ...
Run Code Online (Sandbox Code Playgroud)

或使用联接.

您的编辑建议您希望将其用作表名.这可能意味着你的设计很糟糕.代替:

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, ...);
Run Code Online (Sandbox Code Playgroud)

你几乎总是更好:

CREATE TABLE sometable(
     id integer not null,
     discriminator integer not null,
     primary key (id, discriminator),
     ...
);
Run Code Online (Sandbox Code Playgroud)

或每个架构表.如果由于某种原因你坚持使用这种方法,你可以使用PL/PgSQL的EXECUTE语句来运行动态SQL,如:

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

查询"sometable_1"以查找"blah = 2"的行.手册中的更多信息,请参阅EXECUTE ... USING.

在PostgreSQL的常规SQL中根本不可能这样做.在应用程序或PL/PgSQL中执行此操作.DO可以使用PL/PgSQL 块,但如果您依赖于所有内容,性能将会非常糟糕.

现在修复你的设计,为时已晚.