字符串替换查询结果postgresql

时间:2012-10-08 07:36:42

标签: postgresql psql

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

实施例

select id from ids where some_condition

我想将此id附加到字符串

result_(id)_table类似,其中,id必须替换为从上一个查询返回的id(其中必不可少的是另一个表)

最后,我应该能够执行像

这样的查询
select * from result_id_table

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

2 个答案:

答案 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