私は知らないデータベースで正確な情報を探しています。
これはサードパーティ製品であり、いくつかの質問への回答が遅い上、データがそのdb内にあることがわかっているため、少しレトロなエンジニアリングを行いたいと思います。
1つのテーブルがある場合、このテーブルの列の名前のリストを保持することはできますか?
たとえば、SqlServerでは、テーブルを構成するすべての列をテキストで一覧表示する再利用可能なCREATE
ステートメントにテーブルをダンプすることができます。
コマンドラインに加えて\d+ <table_name>
あなたはすでに見つけました、 情報スキーマ を使って information_schema.columns
:
SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
AND table_name = 'your_table'
;
注:上記の例に従って、値が引用符で囲まれていることを確認してください。
他の回答の補足として、行を返さないSELECTステートメントでも、列名がユーザーやアプリケーションコードに公開されます。
select *
from table_name
where false;
アクセス許可は、これらの方法のいずれかで機能する可能性があります。
情報スキーマ は遅くて確実な方法です。標準化されており、それをサポートする他のデータベースに大部分が移植可能です。そして、それはメジャーバージョンを越えて働き続けるでしょう。
ただし、情報スキーマのviewsは system 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回限りの検索ではほとんど問題になりません。しかし、何度も繰り返されるクエリ/関数で使用すると、違いが生じる可能性があります。
視認性にも微妙な違いがあります。詳細な比較:
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)
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))