So finden Sie eine Tabelle mit einer bestimmten Spalte in postgresql

91

Ich verwende PostgreSQL 9.1. Ich habe den Spaltennamen einer Tabelle. Ist es möglich, die Tabelle (n) zu finden, die diese Spalte haben / haben? Wenn das so ist, wie?

Hasan Iqbal
quelle

Antworten:

61

Sie können Systemkataloge abfragen :

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
quelle
1
Beachten Sie, dass diese Abfrage anscheinend keine Platzhalter '%' akzeptiert, während dies bei der Abfrage in Ravis Antwort der Fall ist.
Skippy le Grand Gourou
@ SkippyleGrandGourou Es akzeptiert "wie 'id%'"
jutky
Dies funktionierte nicht für mich mit oder ohne Platzhalter, ich musste information.schema verwenden, um zu suchen
Lrawls
144

Sie können auch tun

 select table_name from information_schema.columns where column_name = 'your_column_name'
Ravi Shekhar
quelle
1
Seltsamerweise habe ich Fälle gesehen, in denen diese Abfrage Tabellen anzeigt, die bei der Abfrage von @ RomanPekar nicht angezeigt werden. Ich frage mich, warum das so sein sollte
Ken Bellows
1
@ KenBellows Ich denke, pg_class / pg_attirbute kann sich mit neuen Versionen von Postgresql ändern, während information_schema in der ANSI-Spezifikation definiert ist. Für allgemeine Fragen würde ich sagen, dass diese Antwort besser ist. Manchmal muss ich zum Beispiel eine Objekt-ID haben, in diesem Fall muss ich db-engine-spezifische Tabellen verwenden. Außerdem sind information_schema-Ansichten immer ein zusätzlicher Schritt gegenüber db-Engine-spezifischen Tabellen und können manchmal zu einer (etwas) schlechteren Leistung führen
Roman Pekar
Dies war die genauere der beiden angebotenen Lösungen - in meinem Fall. Bei der Abfrage pg_class wurden zwei (von 150) Tabellen übersehen. Die Abfrage information_schema hat alle Tabellen erfasst. Ich muss herumgraben, um zu sehen, warum zwei Tische außerhalb des Joins fielen. Auf jeden Fall danke für die Info!
Thomas Altfather Good
7

Ich habe die Abfrage von @Roman Pekar als Basis verwendet und den Schemanamen hinzugefügt (in meinem Fall relevant).

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
quelle
1

Einfach:

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

Vergrößern Sie den Versatz -B, um bei Bedarf den Tabellennamen abzurufen

Dmitry Belyaev
quelle
1

Platzhalterunterstützung Suchen Sie das Tabellenschema und den Tabellennamen, die die zu suchende Zeichenfolge enthalten.

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
quelle
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
quelle
2
Bitte bearbeiten Sie Ihre Antwort , um eine Erklärung für Ihren Code aufzunehmen. Die Frage ist mehr als sechs Jahre alt und hat neben einigen gut bewerteten, gut erklärten bereits eine akzeptierte Antwort. Ohne eine solche Erklärung zu Ihrer Antwort kann sie herabgestuft oder entfernt werden. Das Hinzufügen dieser zusätzlichen Informationen würde dazu beitragen, das Fortbestehen Ihrer Antwort hier zu rechtfertigen.
Das_Geek