2010-12-02 38 views

回答

6

可以使用Postgres的使用以下查询完整的描述表:

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 ~ '^(TABLENAME)$' 
    AND pg_catalog.pg_table_is_visible(c.oid) 
) 

Tith这一点,你将检索列名和数据类型。

也可以使用-E选项

$ psql -E 

然后简单\d mytable将输出使用的Postgres描述表查询开始PSQL客户端。它适用于每个psql describe命令。

+0

优秀的答案!我遇到了另一个问题,虽然:http://stackoverflow.com/questions/4336465/using-query-to-set-the-column-type-in​​-postgresql – David 2010-12-02 15:13:52

+2

我不认为你需要那个正则表达式匹配,`` c.relname〜'^(TABLENAME)$'`相当于`c.relname ='TABLENAME'`。虽然很好的答案。 – 2010-12-02 18:11:20

10

有一个简单得多在PostgreSQL的方式来获取列的类型。

SELECT pg_typeof(col)::text FROM tbl LIMIT 1 

当然,表格必须至少包含一行。你只能得到没有类型修饰符的基类型(如果有的话)。如果您需要,也可以使用下面的替代方法。
您也可以使用常量函数。该manual on pg_typeof()

对于空(或)表,你可以使用查询系统目录pg_attribute获取列的完整列表和它们各自的类型依次为:

SELECT attnum, attname AS column, format_type(atttypid, atttypmod) AS type 
FROM pg_attribute 
WHERE attrelid = 'myschema.mytbl'::regclass -- optionally schema-qualified 
AND NOT attisdropped 
AND attnum > 0 
ORDER BY attnum; 

手册上format_type()object identifier typesregclass