指定したテーブルのすべての列を一覧表示するにはどうすればよいですか

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

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

1つのテーブルで、このテーブルの列の名前のリストを持つことは可能ですか?

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

コメント

  • どのような種類のアクセスが必要ですか。 DB?
  • @dezso、別のマシン上にありますが、ログインして、管理者権限でpsqlコマンドラインを起動できます
  • 正しく理解していれば、 の\dt[+] table_nameの後にあります。
  • いいえ。\ dt +は列名を明示的に表示していないようです。 "説明"フィールドを追加するだけです。
  • ただし、\ d +テーブル名は機能します!

回答

すでに見つけたコマンドライン\d+ <table_name>に加えて、次のことができます。また、情報スキーマを使用して、 information_schema.columns

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

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

コメント

  • psqlで、\x onまたは\pset expanded onを使用してクエリを実行します結果は(表形式ではなく)線形であるため、読みやすくなります stackoverflow.com/a/9605093/513397
  • 現在のバージョンでは(試してみました9.6)では、psql \d+ public.*で実行して、

スキーマ。コミット前のフックスクリプトでこれを使用して、各コミットによって行われたDBの変更をgitで追跡します。

  • SELECT column_name to get only column name
  • 回答

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

    select * from table_name where false; 

    これらのアプローチのいずれかで権限が機能する可能性があります。

    コメント

    • このSQLをpsqlコマンドに渡すつもりだと思います。その場合は、出力の予期しない事態を避けるために–no-psqlrcオプションを使用することをお勧めします。
    • 選択するために指定する必要があった非表示の列(pg_class.oidなど)を除く

    回答

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

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

    psql(ネイティブコマンドラインインターフェイス)はもちろん高速レーンを使用し、ソースに直接クエリを実行します。 psqlをパラメータ-E で開始すると、SQLの背後にあります\dのようなバックスラッシュコマンドが表示されます。または、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; 

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

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

    コメント

    • 本当にそのように、-Eを示し、psqlのSQLを取得する方法を人々に示します。
    • 同意します。いくつかの速度テストを実行しましたが、pg_catalogは2倍以上の速度で実行されます

    回答

    psql PostgreSQL11以降

    クエリで列タイプを検索する場合は、 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) 

    回答

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

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です