지정된 테이블의 모든 열을 나열하는 방법


292

내가 알지 못하는 데이터베이스에서 정확한 정보를 찾고 있습니다.

타사 제품이므로 몇 가지 질문에 대답하는 데 느리며 데이터가 해당 db에 있다는 것을 알고 있으므로 약간의 복고풍 엔지니어링을 원합니다.

하나의 테이블이 주어지면이 테이블의 열 이름 목록을 가질 수 있습니까?

예를 들어 SqlServer에서는 테이블을 구성 가능한 CREATE모든 열을 텍스트로 나열 하는 재사용 가능한 문 으로 테이블을 덤프 할 수 있습니다 .


DB에 어떤 종류의 액세스 권한이 있습니까?
dezso

@dezso, 그것은 별도의 컴퓨터에 있지만 관리자 권한으로 로그인하여 psql 명령 줄을 시작할 수 있습니다
Stephane Rolland

6
내가 올바르게 이해하면에있는 것 \dt[+] table_name입니다 psql.
dezso

1
아니. \ dt +는 열 이름을 명시 적으로 표시하지 않는 것 같습니다. "설명"필드 만 추가합니다.
Stephane Rolland

12
그러나 \ d + 테이블 이름이 작동합니다!
Stephane Rolland

답변:


344

\d+ <table_name>이미 찾은 명령 줄 외에도 정보 스키마 를 사용하여 information_schema.columns다음을 사용하여 열 데이터를 조회 할 수 있습니다 .

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

참고 : 위의 예에 따라 값을 따옴표로 묶어야합니다.


2
psql의에서, 사용 \x on또는 \pset expanded on읽기 때문에 쉽게 (대신 테이블의) 쿼리 결과 선형을하고 stackoverflow.com/a/9605093/513397
anishpatel

4
현재 버전 (9.6에서 시도)에서는 psql \d+ public.*에서 스키마의 모든 테이블과 뷰에 대한 설명 (스키마 + indeces / fkeys / 트리거)을 얻을 수 있습니다 public. 커밋 전 DB에서 변경 사항을 추적하기 위해 커밋 전 후크 스크립트에서 사용합니다.
Thalis K.

4
열 이름 만 가져 오려면 column_name을 선택하십시오.
Andrew

82

다른 답변을 보완하기 위해 행을 반환하지 않는 SELECT 문조차도 열 이름을 사용자와 응용 프로그램 코드에 노출시킵니다.

select *
from table_name
where false;

이러한 접근 방식 중 하나를 사용하여 권한을 사용할 수 있습니다.


이 SQL을 psql 명령으로 전달한다고 가정합니다. 이 경우 출력에서 ​​놀라움을 피하기 위해 --no-psqlrc 옵션을 사용하는 것이 좋습니다.
JohnMudd

pg_class.oid와 같이 선택하도록 지정
해야하는

71

정보 스키마는 느리고 확실한 방법이다 : 그것은 표준화를 지원하는 다른 데이터베이스에 주로 휴대용입니다. 그리고 주요 버전에서도 계속 작동합니다.

그러나 정보 스키마의 는 종종 표준 카탈로그 형식을 충족시키기 위해 시스템 카탈로그의 많은 테이블에 조인됩니다 . 이것은 그들을 느리게한다 .
Postgres 개발자는 약속하지 않지만 기본 버전 (여기에서 필요한 것과 같은)은 주요 버전에서 변경되지 않습니다.

psql(기본 명령 줄 인터페이스)는 물론 빠른 차선을 취하고 소스를 직접 쿼리합니다. psql매개 변수로-E 시작하면 같은 백 슬래시 뒤에 SQL \d이 표시됩니다. 또는 \set ECHO_HIDDEN onpsql 명령 줄에서. 거기에서 시작하여 질문에 대한 답변을 만들 수 있습니다.

하나의 테이블이 주어지면이 테이블의 열 이름 목록을 가질 수 있습니다.

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

쿼리information_schema.columns 보다 빠릅니다 . EXPLAIN ANALYZE직접 보려고 노력 하십시오. 일회성 조회에는 여전히 문제가되지 않습니다. 그러나 여러 번 반복되는 쿼리 / 함수에 사용하면 차이가 발생할 수 있습니다.

가시성에도 미묘한 차이가 있습니다. 자세한 비교 :


2
정말 당신에게 보여주고 -Epsql의 SQL을 얻는 방법을 사람들에게 보여줍니다.
Evan Carroll

6

psql PostgreSQL 11 이상

검색어에서 열 유형을 찾고 있다면 psql\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)

0

PostgreSQL 만

이것은 다소 하찮지만 가능한 가장 짧은 SQL을 찾고 있다면 경쟁자가 될 수 있습니다.

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

또는 더 짧음 (테이블에 하나 이상의 행이 있다고 가정)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

리스팅은 주문을 유지합니다. 주문에 신경 쓰지 않고 hstore확장 프로그램을 설치 한 경우 더 짧게 할 수 있습니다

SELECT skeys(hstore(NULL::schema_name.table_name))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.