it-swarm.asia

Bagaimana cara mendaftar semua kolom untuk tabel tertentu

Saya mencari informasi dalam database yang tidak saya ketahui.

Ini adalah produk pihak ke-3, mereka lambat dalam menjawab beberapa pertanyaan, dan saya tahu datanya ada di dalam db itu, jadi saya ingin melakukan sedikit teknik retro.

Diberikan satu tabel, apakah mungkin untuk memiliki daftar nama-nama kolom untuk tabel ini?

Sebagai contoh di SqlServer, dimungkinkan untuk membuang tabel ke dalam pernyataan CREATE yang dapat digunakan kembali, yang secara tekstual mencantumkan semua kolom yang terdiri dari tabel tersebut.

321
Stephane Rolland

Selain baris perintah \d+ <table_name> Anda sudah menemukan, Anda juga bisa menggunakan Skema Informasi untuk mencari data kolom, menggunakan information_schema.columns :

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

Catatan: Seperti contoh di atas, pastikan nilainya tertutup dalam tanda kutip.

384
bhamby

Sebagai tambahan untuk jawaban lain, bahkan pernyataan SELECT yang tidak mengembalikan baris akan memaparkan nama kolom kepada Anda dan kode aplikasi.

select *
from table_name
where false;

Izin mungkin ikut bermain dengan salah satu dari pendekatan ini.

Skema informasi adalah cara yang lambat dan pasti: ini distandarisasi dan sebagian besar portabel untuk database lain yang mendukungnya. Dan itu akan terus bekerja di versi utama.

Namun, tampilan dalam skema informasi sering bergabung dalam banyak tabel dari katalog sistem untuk memenuhi format standar ketat - banyak di antaranya hanya barang mati sebagian besar waktu. Ini membuat mereka lambat .
Pengembang Postgres tidak membuat janji, tetapi dasar-dasar (seperti apa yang dibutuhkan di sini) tidak akan berubah di seluruh versi utama.

psql (antarmuka baris perintah asli) mengambil jalur cepat, tentu saja, dan menanyakan sumber secara langsung. Jika Anda memulai psql dengan parameter -E , SQL di belakang perintah backslash seperti \d ditampilkan. Atau \set ECHO_HIDDEN on dari baris perintah psql. Mulai dari sana Anda dapat membangun jawaban untuk pertanyaan Anda.

Diberikan satu tabel, apakah mungkin untuk memiliki daftar nama-nama kolom untuk tabel ini.

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;

Lebih cepat dari permintaan information_schema.columns . Coba EXPLAIN ANALYZE untuk melihat sendiri. Masih sulit untuk satu kali pencarian. Tetapi mungkin membuat perbedaan jika digunakan dalam kueri/fungsi yang diulang berkali-kali.

Ada juga perbedaan visibilitas yang halus. Perbandingan rinci:

76

psql di PostgreSQL 11+

Jika Anda mencari jenis kolom pada kueri, Anda dapat menggunakan 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

khusus PostgreSQL

Ini agak tipu tetapi bisa menjadi pesaing jika Anda mencari SQL sesingkat mungkin:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

atau bahkan lebih pendek (dengan asumsi setidaknya ada satu baris yang ada di tabel)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

Daftar mempertahankan pesanan. Jika Anda tidak peduli dengan pesanan dan memiliki hstore ekstensi terpasang, Anda bahkan dapat melakukan lebih pendek

SELECT skeys(hstore(NULL::schema_name.table_name))
0
oᴉɹǝɥɔ