跨多个模式的Postgresql查询

时间:2014-03-22 20:16:13

标签: postgresql schema

我需要查询多个模式。例如,事先不知道模式:

  • U111
  • U222
  • U333

我需要从这些模式中的每个模式中的特定表中选择这三个模式。我可以将这个查询放在这三个模式中吗?如果是这样,我如何查询它们?请记住,我不会提前知道模式名称,因此需要动态构建它们。

1 个答案:

答案 0 :(得分:0)

如果需要动态构建查询,则有两个选项:预处理语句和函数。

预准备语句仅在会话期间有效,在您注销时会丢失。使用PREPARE语句创建一个准备好的语句,然后为EXECUTE提供一个参数,例如模式名称,为每个要运行它的模式提供一次。

数据库中仍有一个功能可供将来使用。如果需要将来自不同模式的数据组合到一个结果集中,这是您唯一的选择,您应该定义函数以返回SETOF tablename。它或多或少都是这样的:

CREATE FUNCTION query_tablename_schemas (schemas name[]) RETURNS SETOF tablename AS $$
DECLARE
  sch name;
BEGIN
  FOREACH sch IN ARRAY schemas LOOP
    RETURN QUERY 'SELECT * FROM ' || quote_ident(sch) || '.tablename WHERE ...';
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

以上假设您可以在数组中传递模式。如果您有一些查询可以检索模式名称,那么您可以更改循环并执行以下操作:

FOR sch IN
  SELECT schema_name FROM ...
LOOP
  qry := ...
  RETURN QUERY qry;
END LOOP;

在这两种情况下,所有模式中名称为tablename的所有表中的记录都将作为一个表返回,然后您可以在其他查​​询中使用该表:

SELECT *
FROM query_tablename_schemas ('{"U111", "U222", "U333"}')
WHERE ...;