如何在psql查询结果中显示复合类型的字段名及对应值?
psql查询复合类型列同时显示字段名和值的解决方法
可以实现该需求,不需要手动展开复合类型,也不会出现同名字段混淆的问题,具体方案如下:
方案1:psql原生配置(推荐,PostgreSQL 12+ 支持)
psql 12及以上版本内置了tuple_details配置项,开启后会默认在输出复合类型/行类型数据时自动携带字段名:
- 临时生效(仅当前psql会话有效):
直接在psql命令行执行:
开启后再执行你示例中的查询,输出效果如下:\pset tuple_details onscientists | achievements --------------------------------------------------+-------------------------------------------- (scientist_id:1, first_name:Isaac, last_name:Newton) | (scientist_id:1, description:"Classical Mechanics") (scientist_id:2, first_name:Marie, last_name:Curie) | (scientist_id:2, description:"Research into Radioactivity") - 永久生效:
将\pset tuple_details on写入本地psql配置文件~/.psqlrc(Windows系统为%APPDATA%\postgresql\psqlrc.conf),后续每次启动psql都会自动开启该配置。
方案2:旧版本psql兼容方案
如果你的psql版本低于12不支持tuple_details参数,可以用to_json函数转换复合类型输出,同样可以保留字段结构,避免同名字段冲突:
示例查询写法:
SELECT to_json(scientists) AS scientists, to_json(achievements) AS achievements FROM scientists LEFT JOIN achievements ON scientists.scientist_id = achievements.scientist_id;
输出效果如下:
scientists | achievements ------------------------------------+-------------------------------------------- {"scientist_id":1,"first_name":"Isaac","last_name":"Newton"} | {"scientist_id":1,"description":"Classical Mechanics"} {"scientist_id":2,"first_name":"Marie","last_name":"Curie"} | {"scientist_id":2,"description":"Research into Radioactivity"}
这种方式不需要修改psql配置,也可以保留复合类型的层级结构,不会出现字段重名混淆的问题。
内容的提问来源于stack exchange,提问作者Clay Sweetser
相关产品推荐
相关产品推荐

