如何在postgres中加入带有动态标识符的表?
Posted
技术标签:
【中文标题】如何在postgres中加入带有动态标识符的表?【英文标题】:How to join table with dynamic identifier in postgres? 【发布时间】:2014-02-07 04:11:11 【问题描述】:我有一个表名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);
当然可以接受任何使用 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 |
----------------
预期的结果表是:
----------------------
| foo | bar | name |
----------------------
| A | 1 | apple |
| B | 2 | carrot |
----------------------
编辑:为了更清楚,我添加了完整的表格示例。
【问题讨论】:
您需要使用动态 SQL/准备好的语句来执行此操作。在基本 SQL 查询中,您必须有一个显式表。 查看 PL/PgSQL 中的EXECUTE
命令。或者从您的客户端生成查询。
@CraigRinger 我已经看过EXECUTE
声明,但即使这样我也没有设法得到解决方案。因此,如果您有任何想法,请分享。
【参考方案1】:
在客户端做这种事情通常更容易,但如果你想用 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 文档。
【讨论】:
我在陈述我的问题时可能不够清楚。所以我编辑添加了一个实际的例子。您的回答对我没有帮助,因为:1 - 它是一个函数,我要了一个表,2- 表名必须来自基表列foreign_table_name
。但是,我在阅读您的提议时学到了一些 plpgsql,尤其是我缺少的 RETURNS TABLE
。有了这个,我可能会设法找到解决方案。谢谢。
@vaab 如果没有动态 SQL,您将无法执行此操作,因此必须使用 PL/PgSQL 函数或客户端生成的 SQL。以上是关于如何在postgres中加入带有动态标识符的表?的主要内容,如果未能解决你的问题,请参考以下文章