Bagaimana cara mendapatkan nama kolom daftar dan tipe data tabel di PostgreSQL?

91

Dengan query berikut, kita bisa mendapatkan daftar nama kolom dan tipe data tabel di PostgreSQL.

Pratik
sumber

Jawaban:

133

Buka psqlbaris perintah dan ketik:

\d+ table_name
Marouane Afroukh
sumber
1
Saya tidak mengerti mengapa ini bukan jawaban yang paling disukai.
mjezzi
18
Ini tidak lengkap karena OP mungkin ingin melakukan ini secara terprogram dalam kode SQL, tidak hanya melalui psql.
Lukas
Postgres melakukannya secara terprogram, jadi mulai saja postgres dengan flag '-E': psql -Edan untuk setiap perintah backslash, SQL masing-masing akan ditampilkan sebelum hasil perintah.
karatedog
115
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

dengan query di atas Anda dapat kolom dan datatype-nya

selva
sumber
4
Itu tidak akan memberikan jawaban yang benar untuk tipe yang ditentukan pengguna (misalnya, kolom Geometri dan Geografi yang dibuat oleh ogr2ogr , yang berbentuk geometry(Geometry,[SRID])).
GT.
1
Seseorang mungkin juga menggunakan table_catalog = 'my_database'dan table_schema = 'my_schema'untuk mendapatkan hanya kolom dari tabel tertentu dari skema tertentu dari database tertentu.
Marco Mannes
24
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

Ubah hello world dengan nama tabel Anda

Info lebih lanjut tentang itu: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

Pratik
sumber
2
Bekerja, tetapi mengapa Anda menggunakan, c.relname ~ '^(hello world)$bukan hanya c.relname = 'hello world'?
Thomas
18

Jangan lupa untuk menambahkan nama skema jika Anda memiliki beberapa skema dengan nama tabel yang sama.

SELECT column_name, data_type 
FROM information_schema.columns
WHERE table_name = 'your_table_name' AND table_schema = 'your_schema_name';

atau menggunakan psql:

\d+ your_schema_name.your_table_name
BatCat
sumber
7

Jawaban Pratik yang diperbarui untuk mendukung lebih banyak skema dan nullables:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );
Honza Kuchař
sumber
7

Versi yang mendukung pencarian nama kolom dan tipe tabel dalam skema tertentu, dan menggunakan GABUNG tanpa subkueri apa pun

SELECT
    pg_attribute.attname AS column_name,
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type
FROM
    pg_catalog.pg_attribute
INNER JOIN
    pg_catalog.pg_class ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
    pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE
    pg_attribute.attnum > 0
    AND NOT pg_attribute.attisdropped
    AND pg_namespace.nspname = 'my_schema'
    AND pg_class.relname = 'my_table'
ORDER BY
    attnum ASC;
Michal Charemza
sumber
2
    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;
Yordan Georgiev
sumber
2

Untuk membuat topik ini 'lebih lengkap'.

Saya membutuhkan nama kolom dan tipe data pada pernyataan SELECT (bukan tabel).

Jika Anda ingin melakukan ini pada pernyataan SELECT dan bukan pada tabel aktual yang sudah ada, Anda dapat melakukan hal berikut:

DROP TABLE IF EXISTS abc;
CREATE TEMPORARY TABLE abc AS
-- your select statement here!
SELECT 
    *
FROM foo
-- end your select statement
;

select column_name, data_type 
from information_schema.columns 
where table_name = 'abc';
DROP IF EXISTS abc;

Penjelasan singkatnya, itu membuat tabel (temp) dari pernyataan pilih Anda, yang dapat Anda 'panggil' melalui kueri yang disediakan oleh (antara lain) @a_horse_with_no_name dan @selva.

Semoga ini membantu.

Jens van Hellemondt
sumber
2

tanpa menyebutkan skema juga Anda bisa mendapatkan detail yang diperlukan Coba kueri ini->

pilih nama_kolom, jenis_data dari information_schema.columns di mana nama_tabel = 'nama_tabel';

abhinav kumar
sumber
0

Untuk mendapatkan informasi tentang kolom tabel, Anda dapat menggunakan:

\dt+ [tablename]

Untuk mendapatkan informasi tentang tipe data dalam tabel, Anda dapat menggunakan:

\dT+ [datatype]
bizi
sumber
1
\ dt + tablename mendapatkan informasi tentang tabel, tetapi tidak ada kolomnya
zhihong
0

pilih nama_kolom, jenis_data dari informasi_sekolah.kolom di mana nama_tabel = 'nama_tabel_anda' dan nama_tabel = 'nama_data_anda' dan skema_anda = 'nama_sekolah_anda';

Surendra babu Pasumarhti
sumber