如何在postgres中使用动态标识符连接表?

vaa*_*aab 5 sql postgresql plpgsql

我有一个table包含两列的表名foreign_table_name,和foreign_key.

是否可以编写一个SELECT查询,该查询将JOIN包含此表的值以及在列中指定名称的表foreign_table_name

例如,如果我们知道所有可能的目标外表有一个name字段,我想知道我是否可以编写一些内容:

SELECT table.foo, table.bar, foreign_table.name 
FROM table
  JOIN $foreign_table AS foreign_table 
       ON (foreign_table.id = table.foreign_key
           $foreign_table = table.foreign_table);
Run Code Online (Sandbox Code Playgroud)

任何使用PlpgSQL的解决方案当然都是可以接受的.

这是一个简单的内容:

Table ``table``
------------------------------------------------
| foo | bar | foreign_table_name | foreign_key |
------------------------------------------------
|  A  |  1  | fruits             | 8           |
|  B  |  2  | vegetable          | 5           |
------------------------------------------------

Table ``fruit``
---------------
| id  | name  |
---------------
| 8   | apple |
---------------

Table ``vegetable``
----------------
| id  | name   |
----------------
| 5   | carrot |
----------------
Run Code Online (Sandbox Code Playgroud)

预期的结果表将是:

----------------------
| foo | bar | name   |
----------------------
|  A  |  1  | apple  |
|  B  |  2  | carrot |
----------------------
Run Code Online (Sandbox Code Playgroud)

编辑:我添加了全表示例,试图更清楚.

Cra*_*ger 7

在客户端进行此类操作通常更容易,但如果您希望PL/PgSQL可以实现,例如

CREATE OR REPLACE FUNCTION dynamic_call(tblname text)
RETURNS TABLE (foo int, bar text, fname text)
AS $$
BEGIN
  RETURN QUERY EXECUTE format('
    SELECT t.foo, table.bar, f."name"
    FROM mytable t
    JOIN %I AS f ON (f.id = t.foreign_key);', tblname);
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅PL/PgSQL文档.