Bagaimana menemukan tabel yang memiliki kolom tertentu di postgresql

95

Saya menggunakan PostgreSQL 9.1. Saya memiliki nama kolom dari sebuah tabel. Apakah mungkin menemukan tabel yang memiliki / memiliki kolom ini? Jika ya, bagaimana caranya?

Hasan Iqbal
sumber

Jawaban:

65

Anda dapat menanyakan katalog sistem :

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

Roman Pekar
sumber
1
Perhatikan bahwa kueri ini tampaknya tidak menerima karakter pengganti '%', sedangkan kueri dalam jawaban Ravi menerima.
Skippy le Grand Gourou
@SkippyleGrandGourou Itu menerima "seperti 'id%'"
jutky
ini tidak berhasil untuk saya dengan atau tanpa wildcard, saya harus menggunakan information.schema untuk mencari
Lrawls
150

Anda juga bisa melakukannya

 select table_name from information_schema.columns where column_name = 'your_column_name'
Ravi Shekhar
sumber
1
anehnya, saya telah melihat contoh di mana query ini menunjukkan tabel yang tidak dimiliki oleh query @ RomanPekar; Saya bertanya-tanya mengapa itu terjadi
Ken Bellows
1
@KenBellows Saya kira pg_class / pg_attirbute dapat berubah dengan versi baru Postgresql sementara information_schema didefinisikan dalam spesifikasi ANSI. Jadi untuk pertanyaan umum saya akan mengatakan jawaban ini lebih baik. Terkadang saya perlu memiliki id objek misalnya, dalam hal ini saya perlu menggunakan tabel khusus db-engine. Plus, tampilan information_schema selalu merupakan langkah tambahan dari tabel khusus mesin db dan terkadang dapat menyebabkan kinerja (sedikit) lebih buruk
Roman Pekar
Ini adalah yang lebih akurat dari dua solusi yang ditawarkan - dalam kasus saya. Kueri pg_class melewatkan dua (dari 150) tabel. Kueri information_schema menangkap semua tabel. Saya harus menggali sekitar untuk melihat mengapa dua tabel jatuh di luar sambungan. Bagaimanapun, terima kasih atas infonya!
Thomas Altfather Good
7

Saya telah menggunakan kueri @Roman Pekar sebagai basis dan menambahkan nama skema (relevan dalam kasus saya)

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

jutky
sumber
1

Secara sederhana:

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

Enlarge -B offset untuk mendapatkan nama tabel, jika perlu

Dmitry
sumber
1

Dukungan Wildcard Temukan skema tabel dan nama tabel yang berisi string yang ingin Anda temukan.

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;
jjj
sumber
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;
romuloMendes
sumber
3
Harap edit jawaban Anda untuk menyertakan penjelasan tentang kode Anda. Pertanyaan ini berusia lebih dari enam tahun , dan sudah memiliki jawaban yang diterima selain beberapa pertanyaan yang diberi suara bagus dan dijelaskan dengan baik. Tanpa penjelasan seperti itu pada jawaban Anda, itu akan diremehkan atau dihapus. Menambahkan info tambahan itu akan membantu membenarkan kelanjutan jawaban Anda di sini.
Das_Geek