データベースで自分の知らない正確な情報を探しています。
サードパーティ製品です。いくつかの質問への回答が遅く、データがそのデータベース内にあることがわかっているので、少しレトロなエンジニアリングを行いたいと思います。
1つのテーブルで、このテーブルの列の名前のリストを持つことは可能ですか?
たとえば、SqlServerでは、テーブルを再利用可能なステートメント。テーブルを構成するすべての列をテキストで一覧表示します。
コメント
回答
すでに見つけたコマンドライン\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))
\dt[+] table_name
の後にあります。