ある文字列を含むカラムの一覧を検索したいときに使えるSQLのサンプルを紹介します。
SELECT tables.relname as table_name, pa.attname as column_name FROM pg_attribute as pa, ( -- テーブル SELECT * FROM pg_stat_user_tables psut WHERE psut.relname like '%table_name%' -- テーブル名の条件を入力 ORDER BY psut.relname ) as tables WHERE pa.attnum > 0 AND pa.attisdropped is FALSE AND pa.attname like '%column_name%' -- カラム名の条件を入力 AND tables.relid = pa.attrelid ORDER BY pa.attname;
簡単にSQLの中身を説明すると以下のようになっています。
まず、サブクエリで、条件に該当するテーブルの一覧を取得しています。
テーブル一覧は、pg_stat_user_tablesというテーブルが情報を持っています。
そこで取得したテーブル一覧とカラム一覧を結合しています。
カラム一覧は、pg_attributeというテーブルが保持しています。
また、pg_attributeは削除されて現在存在しない列なども保存しているため、
pa.attnum > 0
AND pa.attisdropped is FALSE
といった条件句でそれらを除外しています。
結合条件は、「tables.relid = pa.attrelid」になります。
これは、条件によって抽出済みの pg_stat_user_tables.relid と pg_attribute.attrelid をキー結合しているという意味になります。