【问题标题】:Postgres: convert fetched table name to an actually usable table namePostgres:将获取的表名转换为实际可用的表名
【发布时间】:2021-03-17 14:01:52
【问题描述】:

有没有办法使这个请求生效?
我想从一个表中获取一个表名,然后在同一个 sql 中使用该表名从该依赖表中获取所有数据。

select dt.*
    from tree_node as tn
inner join tree_node_type as tnt
    on tnt.id = tn.type_id
inner join tnt.table_name as dt
    on dt.id = tn.id

今天在尝试此查询时,Postgres 未能说关系“tnt.table_name”不存在。如何让它使用该列的值作为表名?

【问题讨论】:

  • 如果要使用存储为字符串值的表名,则需要使用动态 SQL。
  • @GordonLinoff 好的,谢谢,我去看看

标签: sql postgresql join


【解决方案1】:

如果所有表都知道表结构,则可以使用如下函数:

数据样本

CREATE TABLE t (tbname TEXT);
INSERT INTO t VALUES ('t2'),('t3'); --name of tables created below 

CREATE TABLE t2 (rec TEXT);
INSERT INTO t2 VALUES ('foo-t2'),('bar-t2');

CREATE TABLE t3 (rec TEXT);
INSERT INTO t3 VALUES ('foo-t3'),('bar-t3');

功能

CREATE OR REPLACE FUNCTION getrecords(text) 
RETURNS TABLE (rec TEXT) LANGUAGE plpgsql AS $$
BEGIN
  RETURN QUERY EXECUTE format('SELECT * FROM %I',$1);
END$$;

请注意,这些函数返回一个包含单个列的表,因此您需要调整返回列的数量和类型。 查询

SELECT getrecords(t.tbname) FROM t;

 getrecords 
------------
 foo-t2
 bar-t2
 foo-t3
 bar-t3

演示:db<>fiddle

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多