タイトルそのままだが、全てのプライマリキーのカラムをプライマリーキー毎にカンマ区切りで取得する必要性が生じて、ここを参考にプライマリーキーのカラム一覧を取得する事までは出来た。
これを縦横変換してカンマ区切りが取得できるかなと思ったが、対象は文字列なのでどうすっかなと調べたところ、ポスグレには string_agg なる便利な文字列の集約関数を発見!
Oracle にも ListAgg という文字列集約関数があるけどこちらより使いやすそう。
以下は全プライマリキーのカラムをカンマ区切りで取得するSQLです。
select b.table_name , b.constraint_name , string_agg(b.column_name, ',' order by b.ordinal_position) as cols from ( SELECT c.ordinal_position , c.table_name , ccu.constraint_name , c.column_name , c.data_type FROM information_schema.columns c INNER JOIN information_schema.constraint_column_usage ccu ON c.table_name = ccu.table_name AND c.column_name = ccu.column_name INNER JOIN information_schema.table_constraints tc ON tc.table_catalog = c.table_catalog AND tc.table_schema = c.table_schema AND tc.table_name = c.table_name AND tc.constraint_name = ccu.constraint_name WHERE tc.constraint_type = 'PRIMARY KEY' ORDER BY c.table_name , c.ordinal_position ) d group by table_name , constraint_name ;
なお string_agg はver9.0以上で利用可能。
photo by Travis Warren