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

时间:2014-02-07 04:11:11

标签: sql postgresql plpgsql

我的表名table包含两列foreign_table_nameforeign_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); 字段,我想知道我是否可以编写一些内容:

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

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

这是一个简单的内容:

----------------------
| foo | bar | name   |
----------------------
|  A  |  1  | apple  |
|  B  |  2  | carrot |
----------------------

预期结果表为:

{{1}}

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

1 个答案:

答案 0 :(得分: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;

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