Como encontrar uma tabela com uma coluna específica no postgresql

91

Estou usando o PostgreSQL 9.1. Eu tenho o nome da coluna de uma tabela. É possível encontrar a (s) tabela (s) que possui / possui esta coluna? Se sim, como?

Hasan Iqbal
fonte

Respostas:

61

você pode consultar catálogos do sistema :

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
fonte
1
Observe que esta consulta não parece aceitar os curingas '%', enquanto a consulta na resposta de Ravi aceita.
Skippy le Grand Gourou
@SkippyleGrandGourou Aceita "como 'id%'"
jutky,
isso não funcionou para mim com ou sem curingas, eu tive que usar information.schema para pesquisar
Lrawls
144

Você também pode fazer

 select table_name from information_schema.columns where column_name = 'your_column_name'
Ravi Shekhar
fonte
1
estranhamente, já vi casos em que essa consulta mostra tabelas que a consulta de @RomanPekar não mostra; Eu me pergunto por que isso seria
Ken Bellows
1
@KenBellows Eu acho que pg_class / pg_attirbute pode mudar com novas versões do Postgresql enquanto information_schema é definido na especificação ANSI. Portanto, para consultas gerais, eu diria que esta resposta é melhor. Às vezes preciso ter a id do objeto, por exemplo, neste caso preciso usar tabelas específicas do db-engine. Além disso, as visualizações information_schema são sempre uma etapa adicional sobre as tabelas específicas do mecanismo de banco de dados e às vezes podem levar a um desempenho (um pouco) pior
Roman Pekar
Esta foi a mais precisa das duas soluções oferecidas - no meu caso. A consulta pg_class perdeu duas (de 150) tabelas. A consulta information_schema capturou todas as tabelas. Terei que pesquisar para ver por que duas tabelas caíram fora da junção. Em qualquer caso, obrigado pela informação!
Thomas Altfather Good
7

Usei a consulta de @Roman Pekar como base e adicionei o nome do esquema (relevante no meu caso)

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

saliente
fonte
1

Simplesmente:

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

Aumente o deslocamento -B para obter o nome da tabela, se necessário

Dmitry Belyaev
fonte
1

Suporte a curinga Encontre o esquema e o nome da tabela que contém a string que você deseja encontrar.

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
fonte
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
fonte
2
Por favor edite sua resposta para incluir uma explicação para o seu código. A pergunta tem mais de seis anos e já tem uma resposta aceita, além de várias bem votadas e bem explicadas. Sem essa explicação em sua resposta, ela será rejeitada ou removida. Adicionar essa informação extra ajudaria a justificar a continuação da existência de sua resposta aqui.
Das_Geek