【问题标题】:How to Select * FROM all tables in a schema如何从模式中的所有表中选择 *
【发布时间】:2022-01-22 00:53:59
【问题描述】:

我在同一架构中有 100 个具有相同结构的表。我想运行查询以查看“sqft”列为 NULL 的所有行

SELECT * FROM table WHERE sqft = NULL

我要遍历的所有表都以前缀“tb_”开头
例如'tb_115_spooner_st' 在尝试了此处发布的众多解决方案后,我无法使用单个脚本正确迭代所有这些表。

这就是我目前正在使用的东西

do $$
declare
    rec record;
    query text;
begin
    for rec in select * from pg_tables where schemaname = 'public'
    loop
        query = format('SELECT * FROM %s WHERE sqft = NULL LIMIT 1', rec.tablename);
        --raise notice '%', query;
        execute query;
    end loop;
end
$$ language plpgsql;

我对编写像这样更复杂的 SQL 命令还很陌生,并且很难理解出了什么问题。我知道需要有一个前缀是条件的部分,但现在运行的代码只是在控制台中返回一个“DO”。任何帮助表示赞赏。

【问题讨论】:

  • 在第一个查询中将= 更改为IS,如SELECT * FROM table WHERE sqft is NULL 。请记住,null 不是值。
  • 为什么有这么多非常相似的表?
  • 看起来很奇怪的设计。我会考虑为所有建筑物提供一张公共桌子。
  • 我同意 jarlh。您应该只使用一个表。如果总大小真的很大(数亿行),那么可以考虑通过构建进行分区
  • 一个 DO 块不能返回任何东西。您将不得不编写一个(设置返回)函数

标签: sql postgresql


【解决方案1】:

考虑使用 INFORMATION_SCHEMA.COLUMNS 视图来查找您需要查询的表。

SELECT 
  CONCAT('SELECT * FROM ', table_name,' WHERE sqft IS NULL;') 
FROM 
  INFORMATION_SCHEMA.COLUMNS 
WHERE 
  COLUMN_NAME = 'sqft'

这将为您提供一个 SQL 语句列表,您可以将其复制并粘贴到新终端中,然后作为普通查询运行。

【讨论】:

  • 我一直在寻找可以遍历所有表的东西,但这解决了我的问题,谢谢!如果我找不到迭代表的解决方案,我会将其标记为解决方案。
  • 谢谢@GustafGyllensporre。很抱歉取得了超额成绩;)
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多