2

Postgres のメタデータ テーブル (システム カタログ) を使用してクエリを作成し、必要な情報を取得しています。pg_constraintカタログには、 というタイプの列がありconkeyint2[]を参照しています。pg_attribute.attnum

私の質問は、システム カタログ自体に関するものではなく、このint2[]配列を実際の列名の配列に拡張する方法に関するものです。例えば:

a) pg_constraint:
conname | conrelid | conkey
const1  | 123      | {2, 3}

b) pg_class:
oid | relname
123 | table1

c) pg_attribute:
attrelid | attname | attnum
123      | colA    | 1
123      | colB    | 2
123      | colC    | 3

const_columns以下のように期待される結果を得るにはどうすればよいですか?

pseudo-query:
select b.relname as table, a.conname as constraint,
    /******> a.conkey expanded to c.attname <******/ as const_columns
    from pg_constraint a, pg_class b, pg_attribute c
    where a.conrelid = b.oid
    and c.attrelid = b.oid
    and a.conkey = c.attnum;

expected result:
table  | constraint | const_columns
table1 | const1     | {colB, colC}
4

1 に答える 1

4
select
    b.relname as table,
    a.conname as constraint,
    array_agg(c.attname) as const_columns
from pg_constraint a, pg_class b, pg_attribute c
where
    a.conrelid = b.oid
    and c.attrelid = b.oid
    and c.attnum in (select unnest(a.conkey))
group by b.relname, a.conname

または配列演算子を使用します。

    and array[c.attnum] <@ a.conkey
于 2013-07-13T10:28:50.533 に答える