2013-11-28 54 views
2

我需要从任意SQL查询中获取列类型。这当然是可能的,PgAdmin3做到了。如何从任意SQL select中获取列数据类型?

例如,给定一个查询:

SELECT src.col, CAST(src.col AS varchar) 
FROM (SELECT 'anything' AS col) AS src; 

PgAdmin3返回:

正如你所看到的,列类型显示基础上执行的查询,而不是表模式。如何以编程方式获得结果集中列的数据类型?

+0

我认为这是同一个问题[在这里回答](http://stackoverflow.com/questions/2146705/select-datatype-of-the-field-in-postgres)。该帖子中的查询是否可以帮助你? –

+0

@JeanneBoyarsky不是。这访问信息模式,AFAIU将信息存储在持久列上。我不认为我可以使用它来了解一些'COUNT(*)'是'bigint'既不知道应用类型转换。或者,也许我没有得到信息架构的目的? – skalee

+0

哦。所以你想要类似描述的东西,而不是表格。如果您使用的是像Java这样的调用语言,则可以使用API​​从查询的元数据中获取此信息。我不知道怎么做在命令行(原始的SQL) –

回答

1

C客户端库中的相应功能是PQftype。它提供查询中任何字段的类型(如Retrieving Query Result Information中所述)以及适用于结果字段的其他函数(如PQftablePQfsize)。
不需要EXPLAIN,这些信息随每组结果返回给SQL客户端。

PQftype

Returns the data type associated with the given column number. 

的整数返回是该类型的内部OID号。列 号码从0开始。

Oid PQftype(const PGresult *res, 
       int column_number); 

你可以查询系统表pg_type里获得的各种数据类型的名称和属性 。内置数据 类型的OID在 源树中的src/include/catalog/pg_type.h文件中定义。

此外,所有类型的数据库中的OID的可以得到:

select oid, typname from pg_type; 

其他语言一般基于libpq库的Postgres的支持,这样他们就可以调用这个函数。他们可能会也可能不会公开它,这取决于他们的实施有多完整。

在红宝石的情况下,驾驶员ruby-pg显然做它通过PGResultftype(column_number)实例方法。我不知道这是否对ActiveRecord有任何帮助。与数据库无关的API倾向于忽略不能轻易抽象到所支持的所有数据库的功能。

2

使用系统目录信息功能pg_typeof()

+0

是的,它的工作。除非有人提供更简单的答案,否则我会批准的,那就是像'EXPLAIN ...'那样工作的地方,您可以在不修改SELECT子句的情况下传递整个查询。我认为这将是有用的,当SELECT子句是'*'就像在'SELECT src。* FROM(SELECT CAST('wow'AS varchar)AS col)AS src;'。 – skalee

相关问题