postgresql에서 특정 열이있는 테이블을 찾는 방법


95

PostgreSQL 9.1을 사용하고 있습니다. 테이블의 열 이름이 있습니다. 이 열이 있거나있는 테이블을 찾을 수 있습니까? 그렇다면 어떻게?

답변:


65

시스템 카탈로그 를 쿼리 할 수 ​​있습니다 .

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

그것은 않습니다 @SkippyleGrandGourou은 " '아이디 %'처럼"받아
jutky

이것은 와일드 카드의 유무에 관계없이 작동하지 않았습니다. 검색을 위해 information.schema를 사용해야했습니다
Lrawls

150

당신은 또한 할 수 있습니다

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

1
이상하게도이 쿼리가 @RomanPekar의 쿼리가 아닌 테이블을 표시하는 경우를 보았습니다. 궁금 이유 것
켄 벨로우즈

1
@KenBellows pg_class / pg_attirbute는 새 버전의 Postgresql로 변경 될 수 있지만 information_schema는 ANSI 사양에 정의되어 있습니다. 따라서 일반적인 질문의 경우이 답변이 더 낫다고 말하고 싶습니다. 예를 들어 가끔은 객체 ID가 필요합니다.이 경우에는 db-engine 특정 테이블을 사용해야합니다. 또한, information_schema 뷰는 항상 db 엔진 특정 테이블에 대한 추가 단계이며 때로는 (약간) 성능 저하로 이어질 수 있습니다
Roman Pekar

이것은 제 경우에 제공된 두 가지 솔루션 중 더 정확했습니다. pg_class 쿼리에서 두 개의 (150 개 중) 테이블이 누락되었습니다. information_schema 쿼리는 모든 테이블을 캡처했습니다. 두 테이블이 조인에서 벗어나는 이유를 살펴보아야합니다. 어떤 경우에도 정보 감사합니다!
Thomas Altfather Good

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;

3
제발 답변을 편집 코드에 대한 설명을 포함 할 수 있습니다. 이 질문은 6 년이 넘었으며 , 잘 설명되고 잘 설명 된 몇 가지 질문 외에도 이미 받아 들여진 답변이 있습니다. 귀하의 답변에 대한 그러한 설명이 없으면 반대 투표 또는 제거됩니다. 추가 정보를 추가하면 여기에 답변이 계속 존재하는 것을 정당화하는 데 도움이됩니다.
Das_Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.