显示查询结果的列类型(PostgreSQL)

43

有没有一种简单的方法可以轻松地获取查询结果的列类型?我读了psql文档,但我认为它不支持该功能。理想情况下,我希望能够获得类似于以下内容:

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

我是否可以在不编写任何代码的情况下获取这些信息?


哈,我昨天在 #postgresql 中问了这个问题(当时没有得到答案)。 - Evan Carroll
我不认为 psql 可以直接向您展示它。 但是修改它应该相当容易。也许您可以编写一个存储过程来模拟这个功能。 - Wolph
3个回答

63

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

示例

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

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

                 all_ids
--------------------------------------------
 {30,461577687337538580,471090357619135524}
(1 row)
我们需要一种机制来揭示“all_ids”的类型。

postgres邮件列表档案中,我找到了一个名为pg_typeof的本地pg函数的参考。

使用示例:

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

输出:

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

干杯!


16

使用\gdesc命令(在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[]

1
在Postgres/psql 10中是否存在任何方便的东西? - Justin Bailey
很遗憾,@JustinBailey,我没有找到psql 10的好替代品。 - Lukasz Szozda
1
您可以使用更新版本的 psql 访问旧版的 PostgreSQL 服务器,例如 apt install postgresql-client-11 - Yuri Astrakhan

7

我认为,除非您编写存储过程,否则无法完全打印示例中的内容。

一种方法是(两个“selects”):

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

是的,我只需要类型,不一定需要那种格式。谢谢。 - Justin K
6
与使用pg_typeof() 相比,这似乎有些笨拙和不方便。 - Jay Taylor
4
我同意。生命是一段旅程。 :-) - Konrad Garus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接