【问题标题】:How to get columns data types from arbitrary SQL select?如何从任意 SQL 选择中获取列数据类型?
【发布时间】:2013-12-14 19:51:35
【问题描述】:

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

例如,给定一个查询:

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

PgAdmin3 返回:

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

【问题讨论】:

  • 我认为这是同一个问题answered here。该帖子中的查询对您有帮助吗?
  • @JeanneBoyarsky 不是真的。这将访问信息模式,AFAIU 将信息存储在持久列上。我不认为我可以用它来了解一些 COUNT(*)bigint 也不能了解应用类型转换。或者我没有得到信息架构的目的?
  • 哦。因此,您需要类似 describe 但用于查询而不是表的内容。如果您使用像 Java 这样的调用语言,则有 API 可以从查询的元数据中获取此信息。我不知道如何在命令行(原始sql)
  • @JeanneBoyarsky 我正在使用 Ruby 的 ActiveRecord,是的,这种方法听起来很有趣。我必须进行调查,尽管我很确定可以使用原始 SQL 来完成。
  • 更好的解决方案是另一个答案:stackoverflow.com/a/25369205/3494126

标签: postgresql types


【解决方案1】:

C 客户端库中对应的函数是PQftype。它提供查询中任何字段的类型,如Retrieving Query Result Information 中所述,以及适用于结果字段的其他函数,例如PQftablePQfsize
不需要解释,此信息随每组结果返回 SQL 客户端一起提供。

PQf类型

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;

其他语言的 postgres 支持通常基于 libpq 库,因此它们可以调用此函数。他们可能会也可能不会暴露它,这取决于他们的实现有多完整。

对于 ruby​​,ruby-pg 驱动程序显然是通过 PGResultftype(column_number) 实例方法。我不知道这对 ActiveRecord 是否有帮助。与数据库无关的 API 往往会遗漏无法在它们支持的所有数据库中轻松抽象的函数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,它完成了这项工作。除非有人提供更简单的答案,否则我将批准,即类似于 EXPLAIN … 的答案,您可以在不修改 SELECT 子句的情况下传递整个查询。我认为当 SELECT 子句是 * 时,这会很有用,就像在 SELECT src.* FROM (SELECT CAST('wow' AS varchar) AS col) AS src; 中一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多