我有一个查询,它总是只返回一个元素。我想将此查询的结果附加到一个字符串中,我可以将其用于进一步处理
实施例
select id from ids where some_condition
我想将此id附加到字符串
中与result_(id)_table
类似,其中,id必须替换为从上一个查询返回的id(其中必不可少的是另一个表)
最后,我应该能够执行像
这样的查询select * from result_id_table
其中,“result_id_table”是id被适当替换的表的名称
答案 0 :(得分: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;
如果您正在收集其他信息
,请使用子查询合并到字符串中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
块,但如果您依赖于所有内容,性能将糟糕。
现在修复你的设计,为时已晚。
答案 1 :(得分:1)
我在Redshift上使用Postgres,遇到一个问题,尝试在etl中使用动态日期并找到了解决方案。
使用变量值的一种正确方法是使用run'
from /Users/ediewoelfle/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in
:
require'
from /Users/ediewoelfle/.rbenv/versions/2.4.0/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in
免责声明:这不是安全的解决方案,但是您可以更改它以使用sqlalchemy f' '
和query = f''' select * from table where date >= '{my_date}' order by date '''
--- Docs on sqlalchemy。