我需要从任意SQL查询中获取列类型。这当然是可能的,PgAdmin3做到了。如何从任意SQL select中获取列数据类型?
例如,给定一个查询:
SELECT src.col, CAST(src.col AS varchar)
FROM (SELECT 'anything' AS col) AS src;
PgAdmin3返回:
正如你所看到的,列类型显示基础上执行的查询,而不是表模式。如何以编程方式获得结果集中列的数据类型?
我需要从任意SQL查询中获取列类型。这当然是可能的,PgAdmin3做到了。如何从任意SQL select中获取列数据类型?
例如,给定一个查询:
SELECT src.col, CAST(src.col AS varchar)
FROM (SELECT 'anything' AS col) AS src;
PgAdmin3返回:
正如你所看到的,列类型显示基础上执行的查询,而不是表模式。如何以编程方式获得结果集中列的数据类型?
C客户端库中的相应功能是PQftype
。它提供查询中任何字段的类型(如Retrieving Query Result Information中所述)以及适用于结果字段的其他函数(如PQftable
或PQfsize
)。
不需要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
显然做它通过PGResult的 ftype(column_number)
实例方法。我不知道这是否对ActiveRecord有任何帮助。与数据库无关的API倾向于忽略不能轻易抽象到所支持的所有数据库的功能。
使用系统目录信息功能pg_typeof()
。
是的,它的工作。除非有人提供更简单的答案,否则我会批准的,那就是像'EXPLAIN ...'那样工作的地方,您可以在不修改SELECT子句的情况下传递整个查询。我认为这将是有用的,当SELECT子句是'*'就像在'SELECT src。* FROM(SELECT CAST('wow'AS varchar)AS col)AS src;'。 – skalee
我认为这是同一个问题[在这里回答](http://stackoverflow.com/questions/2146705/select-datatype-of-the-field-in-postgres)。该帖子中的查询是否可以帮助你? –
@JeanneBoyarsky不是。这访问信息模式,AFAIU将信息存储在持久列上。我不认为我可以使用它来了解一些'COUNT(*)'是'bigint'既不知道应用类型转换。或者,也许我没有得到信息架构的目的? – skalee
哦。所以你想要类似描述的东西,而不是表格。如果您使用的是像Java这样的调用语言,则可以使用API从查询的元数据中获取此信息。我不知道怎么做在命令行(原始的SQL) –