Comment trouver une table ayant une colonne spécifique dans postgresql

92

J'utilise PostgreSQL 9.1. J'ai le nom de colonne d'une table. Est-il possible de trouver la (les) table (s) qui a / ont cette colonne? Si c'est le cas, comment?

Hasan Iqbal
la source

Réponses:

62

vous pouvez interroger les catalogues système :

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
la source
1
Notez que cette requête ne semble pas accepter les caractères génériques '%', contrairement à la requête de la réponse de Ravi.
Skippy le Grand Gourou
@SkippyleGrandGourou Il accepte "comme 'id%'"
jutky
cela n'a pas fonctionné pour moi avec ou sans caractères génériques, j'ai dû utiliser information.schema pour rechercher
Lrawls
144

Vous pouvez aussi faire

 select table_name from information_schema.columns where column_name = 'your_column_name'
Ravi Shekhar
la source
1
bizarrement, j'ai vu des cas où cette requête montre des tables que la requête de @ RomanPekar n'affiche pas; Je me demande pourquoi ce serait
Ken Bellows
1
@KenBellows Je suppose que pg_class / pg_attirbute peut changer avec les nouvelles versions de Postgresql alors que information_schema est défini dans la spécification ANSI. Donc, pour les questions générales, je dirais que cette réponse est meilleure. Parfois, j'ai besoin d'un identifiant d'objet par exemple, dans ce cas, je dois utiliser des tables spécifiques au moteur db. De plus, les vues information_schema sont toujours une étape supplémentaire par rapport aux tables spécifiques du moteur de base de données et peuvent parfois entraîner des performances (légèrement) moins bonnes
Roman Pekar
C'était la plus précise des deux solutions proposées - dans mon cas. La requête pg_class a manqué deux (sur 150) tables. La requête information_schema a capturé toutes les tables. Je vais devoir fouiller pour voir pourquoi deux tables sont tombées en dehors de la jointure. En tout cas merci pour l'info!
Thomas Altfather Good
7

J'ai utilisé la requête de @Roman Pekar comme base et ajouté le nom du schéma (pertinent dans mon cas)

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
la source
1

Simplement:

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

Agrandir -B offset pour obtenir le nom de la table, si besoin

Dmitry
la source
1

Prise en charge des caractères génériques Recherchez le schéma de la table et le nom de la table contenant la chaîne que vous souhaitez rechercher.

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
la source
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
la source
2
Veuillez modifier votre réponse pour inclure une explication de votre code. La question a plus de six ans et a déjà une réponse acceptée en plus de plusieurs réponses bien votées et bien expliquées. Sans une telle explication sur votre réponse, elle risque d'être rejetée ou supprimée. L'ajout de ces informations supplémentaires aiderait à justifier l'existence continue de votre réponse ici.
Das_Geek