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;

regclassSQL インジェクションを効果的に防ぐために、オブジェクト識別子型の変数を使用しています。この関連する回答の詳細:
PostgreSQL 関数パラメーターとしてのテーブル名

于 2013-06-27T05:37:17.270 に答える