ポスグレで指定テーブルの情報を取得する

主キーやUNIQUE制約の情報も含めて指定テーブルの情報を一覧する

PostgreSQLではpg_で始まるテーブルにいろんな情報が詰まっています。
が、残念ながらそれらの情報を簡単に見るためのストアドファンクションなどはあまり用意されていません。
MSSQLServerで言うところのsp_columnsのような、指定テーブルの情報を表示するストアドがあれば便利なのに・・
というわけでクエリで書いてみました。
ここらへんに一通りの情報はあるのですが、
ポスグレ利用者の数が少ないせいのか、日本語だとちょっと情報が見つけづらいようです。

以下はPrimary KeyやUnique制約も一覧項目に加えて表示するクエリです。
前半のCASE句は教えてgooだかどっかのフォーラムで見かけたのを流用。
SELECT
  stat.relname AS tableName,--テーブル名
  att.attname AS columnName,--カラム名
  att.attnum AS columnNumber, --カラム番号
CASE type.typname
  WHEN '_bpchar' THEN 'char' WHEN '_varchar' THEN 'varchar' WHEN '_date' THEN 'date' WHEN '_float8' THEN 'float8' WHEN '_int4' THEN 'integer' WHEN '_interval' THEN 'interval' WHEN '_numeric' THEN 'numeric' WHEN '_float4' THEN 'float4' WHEN '_int2' THEN 'smallint' WHEN '_text' THEN 'text' WHEN '_time' THEN 'time' WHEN '_timestamp' THEN 'timestamp'
END AS columnType,--カラムのデータ型
CASE type.typname
  WHEN '_bpchar' THEN att.atttypmod - 4 WHEN '_varchar' THEN att.atttypmod - 4 WHEN '_numeric' THEN (att.atttypmod - 4) / 65536 ELSE att.attlen
END AS ColumnLength,--カラムの長さ
CASE type.typname
  WHEN '_numeric' THEN (att.atttypmod - 4) % 65536 ELSE 0
END AS floatPart, --小数点絡み(あれば)
con_u.conname,--制約。uniqueなどの場合に出る
CASE con_u.contype
  WHEN 'u' THEN 'unique' ELSE NULL
END AS isUnique,--unique制約があるかどうか
CASE con_p.contype
  WHEN 'p' THEN 'primary' ELSE NULL
END AS isPrimary--primarykeyかどうか
FROM pg_stat_user_tables stat
INNER JOIN pg_attribute att ON att.attrelid = stat.relid
INNER JOIN pg_type type ON att.atttypid = type.typelem
INNER JOIN pg_class class ON class.relname = stat.relname
LEFT JOIN pg_constraint con_u ON con_u.conkey[1] = att.attnum
  AND con_u.contype = 'u' AND con_u.conrelid = class.relfilenode
LEFT JOIN pg_constraint con_p ON att.attnum = ANY (con_p.conkey)
  AND con_p.contype = 'p' AND con_p.conrelid = class.relfilenode
WHERE 1 = 1
  AND stat.schemaname = 'スキーマ名'--スキーマを指定
  AND att.attnum > 0
  AND substr(type.typname,1,1) = '_'
  AND stat.relname = 'テーブル名' --テーブルを指定
ORDER BY stat.schemaname, stat.relname, att.attnum

以下は外部キー制約を表示するクエリです。
外部キーという都合上、上記クエリのように簡単に一覧表示というわけにもいかないので、参照元と参照先は配列表示です。
制約の参照先(con_f.conkey)がsmallint型の配列で、出来ればカラム名を取ってきたいところですが、配列の扱いが地味に難しいので断念。
ANYの所はもうちょいなんとかなる気がします。
ちなみにarray_accum集約関数はここから持って来ました。
SELECT
  stat.relname AS tableName,--制約のあるテーブル(where句で指定したテーブル
  array_accum(att.attname) AS columnName,--制約付きのカラム名(配列型)
  con_f.conname AS f_keyName,--制約名
  class_f.relname AS f_tableName,--外部キーの所属するテーブル
  con_f.conkey--外部キーのカラム番号
FROM pg_stat_user_tables stat
INNER JOIN pg_attribute att ON att.attrelid = stat.relid
INNER JOIN pg_type type ON att.atttypid = type.typelem
INNER JOIN pg_class class ON class.relname = stat.relname
INNER JOIN pg_constraint con_f ON ( att.attnum = ANY (con_f.conkey)
  AND con_f.contype = 'f' AND con_f.conrelid = class.relfilenode )
INNER JOIN pg_class class_f ON class_f.relfilenode = con_f.confrelid
WHERE 1 = 1
  AND stat.schemaname = 'スキーマ名'
  AND att.attnum > 0
  AND substr (type.typname,1,1) = '_'
  AND stat.relname = 'テーブル名'
GROUP BY stat.relname, con_f.conname, class_f.relname, con_f.conkey