webentwicklung-frage-antwort-db.com.de

Wie bekomme ich eine Listenspalte und einen Datentyp einer Tabelle in PostgreSQL?

Mit der folgenden Abfrage können wir eine Liste mit Spaltennamen und Datentyp einer Tabelle in PostgreSQL erhalten.

33
Pratik
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)
        );

Change the hello world with your table name

Weitere Informationen dazu: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

12
Pratik

Öffnen Sie die psql-Befehlszeile und geben Sie Folgendes ein:

\d+ table_name
57
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

mit der obigen Abfrage können Sie Spalten und deren Datentyp angeben

52
selva

Pratik-Antwort wurde aktualisiert, um mehr Schemata und Nullwerte zu unterstützen:

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'
    );
2
Honza Kuchař

Vergessen Sie nicht, den Schemanamen hinzuzufügen, falls Sie mehrere Schemas mit denselben Tabellennamen haben.

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

oder mit psql:

\d+ your_schema_name.your_table_name

2
BatCat

Um Informationen über die Tabellenspalte zu erhalten, können Sie Folgendes verwenden:

\dt+ [tablename]

Um Informationen über den Datentyp in der Tabelle zu erhalten, können Sie Folgendes verwenden:

\dT+ [datatype]
1
bizi

Um dieses Thema 'vollständiger' zu machen.

Ich benötigte die Spaltennamen und Datentypen in einer SELECT-Anweisung (keine Tabelle).

Wenn Sie dies für eine SELECT-Anweisung anstelle einer tatsächlich vorhandenen Tabelle tun möchten, können Sie Folgendes tun:

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;

Kurze Erklärung, es erstellt eine (temporäre) Tabelle Ihrer select-Anweisung, die Sie über die Abfrage aufrufen können, die (unter anderem) von @a_horse_with_no_name und @selva bereitgestellt wird.

Hoffe das hilft.

0

wählen Sie column_name, data_type aus information_schema.columns, wobei table_name = 'your_table_name' und table_catalog = 'your_database_name' und table_schema = 'your_schema_name'.

    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
    ;
0
Yordan Georgiev