web-dev-qa-db-ja.com

指定したテーブルのすべての列を一覧表示する方法

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

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

1つのテーブルがある場合、このテーブルの列の名前のリストを保持することはできますか?

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

321

コマンドラインに加えて\d+ <table_name>あなたはすでに見つけました、 情報スキーマ を使って information_schema.columns

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

注:上記の例に従って、値が引用符で囲まれていることを確認してください。

384
bhamby

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

select *
from table_name
where false;

アクセス許可は、これらの方法のいずれかで機能する可能性があります。

情報スキーマ は遅くて確実な方法です。標準化されており、それをサポートする他のデータベースに大部分が移植可能です。そして、それはメジャーバージョンを越えて働き続けるでしょう。

ただし、情報スキーマのviewssystem catalogs の多くのテーブルに結合して、厳密に標準化されたフォーマット-その多くは、ほとんどの場合、運送便のみです。これにより、それらは遅くなります
Postgres開発者は約束をしていませんが、基本(ここで必要なものなど)はメジャーバージョン間で変更されません。

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

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;

querying information_schema.columns より高速です。 EXPLAIN ANALYZEを試してみてください。それでも、1回限りの検索ではほとんど問題になりません。しかし、何度も繰り返されるクエリ/関数で使用すると、違いが生じる可能性があります。

視認性にも微妙な違いがあります。詳細な比較:

76

psql(PostgreSQL 11以降)

クエリで列の種類を探している場合は、 psql 's \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)
8
Evan Carroll

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))
0
oᴉɹǝɥɔ