postgresqlで特定の列を持つテーブルを見つける方法


92

PostgreSQL 9.1を使用しています。テーブルの列名があります。この列を持つ/持っているテーブルを見つけることは可能ですか?もしそうなら、どうですか?

回答:


62

システムカタログを照会できます。

select c.relname
from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
where a.attname = <column name> and c.relkind = 'r'

sql fiddle demo


1
このクエリは '%'ワイルドカードを受け入れないようですが、Raviの回答のクエリは受け入れます。
Skippy le Grand Gourou 2017

@SkippyleGrandGourou「like 'id%'」を受け入れます
ジューキーな

これは、ワイルドカードの有無に関係なく機能しませんでした。検索にはinformation.schemaを使用する必要がありました
Lrawls '14 / 02/14

144

あなたもすることができます

 select table_name from information_schema.columns where column_name = 'your_column_name'

1
奇妙なことに、このクエリで@RomanPekarのクエリでは表示されないテーブルが表示される場合があります。それはなぜだろう
ケンベローズ

1
@KenBellows information_schemaがANSI仕様で定義されている場合、pg_class / pg_attirbuteはPostgresqlの新しいバージョンで変更される可能性があると思います。したがって、一般的なクエリについては、この答えの方が良いと思います。たとえば、オブジェクトIDが必要になる場合があります。この場合、db-engine固有のテーブルを使用する必要があります。さらに、information_schemaビューは常にdbエンジン固有のテーブルに対する追加のステップであり、(わずかに)パフォーマンスが低下する場合があります
Roman Pekar

これは、私の場合、提供された2つのソリューションの中でより正確でした。pg_classクエリで2つの(150の)テーブルが失われました。information_schemaクエリは、すべてのテーブルをキャプチャしました。なぜ2つのテーブルが結合の外に落ちたのかを調べる必要があります。とにかく情報に感謝!
Thomas Altfatherグッド

7

@Roman Pekarのクエリをベースとして使用し、スキーマ名を追加しました(私の場合に関連します)

select n.nspname as schema ,c.relname
    from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
    inner join pg_namespace as n on c.relnamespace = n.oid
where a.attname = 'id_number' and c.relkind = 'r'

sql fiddle demo


1

単に:

$ psql mydatabase -c '\d *' | grep -B10 'mycolname'

必要に応じて、テーブル名を取得するために-Bオフセットを拡大します


1

ワイルドカードのサポート検索する文字列を含むテーブルスキーマとテーブル名を検索します。

select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name
                                and c.table_schema = t.table_schema
where c.column_name like '%STRING%'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

0
select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name 
                                and c.table_schema = t.table_schema
where c.column_name = 'name_colum'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

2
コードの説明を含めるように回答編集してください。質問は6年以上前のものであり、十分に支持され、よく説明されているいくつかの回答に加えて、すでに受け入れられた回答があります。あなたの答えに対するそのような説明がなければ、それは反対票を投じられるか削除されることになります。その追加情報を追加することは、あなたの答えがここに存在し続けることを正当化するのに役立ちます。
Das_Geek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.