動的SQLを探しています。システムカタログからクエリを自動的にアセンブルします:
SELECT string_agg('SELECT student_name, '''
|| c.oid::regclass || ''' AS tbl, pid FROM '
|| c.oid::regclass
|| $$ WHERE student_name = 'John Doe'$$
, E'\nUNION ALL\n')
FROM pg_namespace n
JOIN pg_class c ON c.relnamespace = n.oid
WHERE n.nspname = 'public' -- schema name where your tables lie
AND c.relname LIKE 't%' -- and / or filter table names
AND EXISTS (
SELECT 1 FROM pg_attribute
WHERE attrelid = c.oid
AND attname = 'student_name' -- make sure column exists
AND NOT attisdropped -- and is alive
);
クエリ文字列を生成します:
SELECT student_name, 'tbl1' AS tbl, pid FROM tbl1 WHERE student_name = 'John Doe'
UNION ALL
SELECT student_name, 'tbl2' AS tbl, pid FROM tbl2 WHERE student_name = 'John Doe'
UNION ALL
SELECT student_name, 'tbl3' AS tbl, pid FROM tbl3 WHERE student_name = 'John Doe'
...
次に、2回目の呼び出しで実行するか、EXECUTE
を使用してPL/pgSQL関数で完全に自動化します。 。例:
テーブルから動的な列のセットを選択し、それぞれの合計を取得します
このクエリは安全を生成します SQLインジェクションを防ぐサニタイズされた識別子を持つコード。 (oid::regclass
の説明 ここに。)
より多くの関連する答えがあります。検索を使用します。
ところで、LIKE
student_name LIKE 'John Doe'
で 無意味です。ワイルドカードを使用しない場合は、=
を使用してください 。