3

我的数据库中的表很少。它们都有相同的列(id、name),但表名不同。这些表的名称以字母“h”开头。
不是一个非常有趣的架构设计,但我必须遵循它。
我需要在所有这些表中搜索 id 。

我尝试了类似的东西:

select id from (select table_name 
FROM information_schema.tables 
where table_name like 'h%') as t;

我收到错误:

ERROR:  column "id" does not exist.

我现在了解错误但我仍然不知道如何进行查询?

4

1 回答 1

3

您需要动态 SQL来执行此操作,因为您不能将值用作普通 SQL 中的标识符。编写一个 PL/pgSQL 函数EXECUTE

CREATE FUNCTION f_all_tables()
  RETURNS TABLE (id int) AS
$func$
DECLARE
    _tbl regclass;
BEGIN

FOR _tbl IN
    SELECT c.oid::regclass
    FROM   pg_catalog.pg_class c
    JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE  c.relkind = 'r'
    AND    c.relname LIKE 'h%'
    AND    n.nspname = 'public' -- your schema name here
LOOP
    RETURN QUERY EXECUTE '
    SELECT id FROM ' || _tbl;
END LOOP;

END
$func$ LANGUAGE plpgsql;

我正在使用对象标识符类型的变量regclass来有效地防止 SQL 注入。有关此相关答案的更多信息:
Table name as a PostgreSQL function parameter

于 2013-06-27T05:37:17.270 回答