如何从任意SQL选择中获取列数据类型?

时间:2013-11-28 17:27:57

标签: postgresql types

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

例如,给定一个查询:

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

PgAdmin3返回:

如您所见,列类型基于执行的查询而不是表模式显示。如何以编程方式获取结果集中列的数据类型?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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;

其他语言通常基于libgq库的postgres支持,因此他们可以调用此函数。它们可能会也可能不会暴露它,具体取决于它们的实施完成程度。

对于ruby,ruby-pg驱动程序显然是通过PGResult来完成的 ftype(column_number)实例方法。我不知道这对ActiveRecord是否有任何帮助。与数据库无关的API往往会遗漏在其支持的所有数据库中无法轻易抽象的功能。