从 PostgreSQL 模式内的所有表中进行选择

Sta*_*t-R 8 postgresql select

是否可以从架构内的所有表中进行选择?我得到了所有的表名

select table_name from information_schema.tables

但我无法使用它来进行查询。

dez*_*zso 5

您不能直接执行此操作,因为如果表名未知(即来自某个变量或子查询),则无法编写“正常”查询。但是您可以为此构建和执行动态 SQL 语句。例如,如果您需要每个表中的列 'name',您可以执行以下操作(在PL/pgSQL 函数中):

FOR i IN SELECT table_name 
           FROM information_schema.tables 
          WHERE table_schema = 'your_desired_schema'
LOOP
    sql_string := sql_string || format($$
        -- some whitespace is mandatory here
        UNION
        SELECT name FROM %I
    $$,
    i.table_name);
END LOOP;

EXECUTE sql_string;
Run Code Online (Sandbox Code Playgroud)

但是,在这种形式中它不起作用,因为除非您将其放入变量中SELECTplpqsql否则您无法进入。您可以为此创建一个临时表,循环结果(在另一个FOR循环中),或者 - 不使用UNION- 仅在每次迭代中返回,具体取决于您的需要。

而且,当然,这假定您要从所有表中选择一列(或多于一列,但始终具有相同的名称和类型)。如果您只需要每个表中的所有数据,那么这些表必须具有相同的结构(相同的列类型,顺序相同,名称相同)。

笔记:

  • format()功能是在 9.1 版本中引入的
  • 为了保持简单,我省略了任何 PL/pgSQL 块的一些必需元素
  • 使用DO块提到的早期版本。它的问题在于您不能简单地使用SELECT那里来返回行,正如在另一个答案中指出的那样。