【问题标题】:Show query result column types (PostgreSQL)显示查询结果列类型 (PostgreSQL)
【发布时间】:2011-03-17 02:47:10
【问题描述】:

有没有办法轻松获取查询结果的列类型?我阅读了 psql 文档,但我认为它不支持。理想情况下,我可以得到类似的东西:

 columna : text | columnb : integer
----------------+-------------------
 oh hai         |                42

有没有一种方法可以在不编码的情况下获取这些信息?

【问题讨论】:

  • 哈,我昨天刚刚在#postgresql 中问过这个问题(当时没有答案)
  • 我不认为psql 可以直接向您展示。但是修改它应该很容易做到这一点。也许您可以编写一个存储过程来模拟这一点。

标签: postgresql psql


【解决方案1】:

可以获取任何SELECT查询结果列类型。

示例

给定以下查询和结果,让我们回答问题*“all_ids 的列类型是什么?”*

SELECT array_agg(distinct "id") "all_ids" FROM "auth_user";

                 all_ids
--------------------------------------------
 {30,461577687337538580,471090357619135524}
(1 row)

我们需要一种机制来揭示“all_ids”的类型。

postgres mailing list archives 上,我发现了一个名为 pg_typeof 的原生 pg 函数的引用。

示例用法:

SELECT pg_typeof(array_agg(distinct "id")) "all_ids" FROM "auth_user";

输出:

 all_ids
----------
 bigint[]
(1 row)

干杯!

【讨论】:

    【解决方案2】:

    \gdesc command(psql 11) 绝对可以:

    \gdesc

    显示当前查询缓冲区结果的描述(即列名和数据类型)。查询实际上不是 执行; 但是,如果它包含某种类型的语法错误,那 正常报错。

    如果当前查询缓冲区为空,则改为描述最近发送的查询。

    例如:

    $ SELECT * FROM pg_database \gdesc
    
        COLUMN     |   TYPE    
    ---------------+-----------
     datname       | name
     datdba        | oid
     encoding      | INTEGER
     datcollate    | name
     datctype      | name
     datistemplate | BOOLEAN
     datallowconn  | BOOLEAN
     datconnlimit  | INTEGER
     datlastsysoid | oid
     datfrozenxid  | xid
     datminmxid    | xid
     dattablespace | oid
     datacl        | aclitem[]
    

    【讨论】:

    • postgres/psql 10 中是否存在任何方便的东西?
    • @JustinBailey 不幸的是,我没有找到 psql 10 的等价物。
    • 你可以使用更高版本的psql来访问旧的PostgreSQL服务器,例如apt install postgresql-client-11
    【解决方案3】:

    我认为你不能准确地打印示例中的内容,除非你为它编写一个存储过程。

    一种方法(两个“选择”):

    1. create table my_table as select ...
    2. \d my_table
    3. select * from my_table

    【讨论】:

    • 是的,我只需要类型,不一定是那种格式。谢谢。
    • 与使用 pg_typeof() 相比,这似乎相当笨拙和不方便。
    • @JayTaylor 我同意。人生是一场旅程。 :-)
    猜你喜欢
    • 2018-08-18
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2012-12-30
    相关资源
    最近更新 更多