指定したテーブルのすべての列をリストするにはどうすればよいですか


293

私は知らないデータベースの正確な情報を探しています。

これはサードパーティ製品であり、いくつかの質問に答えるのが遅く、データがそのデータベース内にあることを知っているので、少しレトロエンジニアリングを行いたいと思います。

1つのテーブルが与えられた場合、このテーブルの列の名前のリストを持つことは可能ですか?

たとえば、SqlServerでは、テーブルを再利用可能なCREATEステートメントにダンプすることができます。これは、テーブルを構成するすべての列をテキストでリストします。


DBにはどのようなアクセス権がありますか?
dezso

@dezso、別のマシン上にありますが、管理者権限でログインしてpsqlコマンドラインを起動できます
ステファン・ローランド

6
私があなたを正しく理解していれば、あなたは後\dt[+] table_nameにいpsqlます。
-dezso

1
いや。\ dt +は、列名を明示的に表示しないようです。「説明」フィールドを追加するだけです。
ステファンローランド

12
しかし、\ d +テーブル名は機能します!
ステファンローランド

回答:


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.*で、publicスキーマ内のすべてのテーブルとビューの説明(スキーマ+ indeces / fkeys / triggers)を取得できます。コミット前のフックスクリプトで使用して、各コミットによって行われたDBの変更をgitで追跡します。
タリスK.

4
SELECT column_nameが列名のみ取得する
アンドリュー・

82

他の回答の補足として、行を返さないSELECTステートメントでさえ、列名をユーザーとアプリケーションコードに公開します。

select *
from table_name
where false;

これらのアプローチのいずれかで許可が関係する場合があります。


このSQLをpsqlコマンドに渡すことを意味すると思います。その場合、出力での驚きを避けるために--no-psqlrcオプションを使用することをお勧めします。
ジョンマッド

選択するために指定する必要があった非表示列(pg_class.oidなど)を
除く

71

情報スキーマは遅いと確実な方法である:それは、標準化とそれをサポートする他のデータベースへの大部分は、ポータブルです。そして、それはメジャーバージョン間で機能し続けます。

ただし、情報スキーマのビューは、厳密に標準化された形式を満たすために、システムカタログの多くのテーブルに結合することがよくあります。その多くは、ほとんどの場合、単なる貨物です。これはそれらを遅くします。
Postgresの開発者は約束をしていませんが、基本的なもの(ここで必要なものなど)はメジャーバージョン間で変更されません。

psql(ネイティブコマンドラインインターフェイス)は、もちろん高速レーンを使用し、ソースに直接クエリを実行します。psqlパラメータ-Eで開始すると、バックスラッシュコマンドのようなSQL \dが表示されます。または\set ECHO_HIDDEN on、psqlコマンドラインから。そこから始めて、質問に対する答えを作成できます。

1つのテーブルが与えられた場合、このテーブルの列の名前のリストを持つことは可能ですか?

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
本当に好きなの-Eは、psqlのsqlを取得する方法とその方法を示すことです。
エヴァンキャロル

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)))

またはさらに短い(テーブルに少なくとも1つの行が存在すると仮定)

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.