4

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

例子

select id from ids where some_condition

我想将此 id 附加到一个字符串中

like 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;

查询“sometable_1”中“blah = 2”的行。手册中的更多信息,请参阅EXECUTE ... USING

在 PostgreSQL 的常规 SQL 中根本不可能做到这一点。在应用程序或 PL/PgSQL 中执行此操作。可以使用PL/PgSQL块,但是如果您在所有事情上都依赖它,DO性能将会很糟糕。

立即修复您的设计,以免为时已晚。

于 2012-10-08T07:56:50.253 回答
1

我在 Redshift 上使用 Postgres,遇到了尝试在 etl 中使用动态日期并找到解决方案的问题。

使用变量值的一种正确方法是使用f' '

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

Disclaimer: this is not a secure solution, but you could alter it to use sqlalchemy text and bindparam--- Docs on sqlalchemy.

于 2018-10-31T00:17:43.407 回答