栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PostgreSQL返回结果集为JSON数组?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PostgreSQL返回结果集为JSON数组?

TL; DR

SELECt json_agg(t) FROM t

用于对象的JSON数组,以及

SELECt    json_build_object(        'a', json_agg(t.a),        'b', json_agg(t.b)    )FROM t

用于数组的JSON对象。

对象清单

本节介绍如何生成对象的JSON数组,并将每一行转换为单个对象。结果看起来像这样:

[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]

9.3及以上

json_agg
函数立即产生此结果。它会自动找出如何将其输入转换为JSON并将其聚合为一个数组。

SELECt json_agg(t) FROM t

没有的

jsonb
版本(在9.4中引入)
json_agg
。您可以将行聚合到一个数组中,然后将其转换:

SELECt to_jsonb(array_agg(t)) FROM t

json_agg
与演员表结合:

SELECt json_agg(t)::jsonb FROM t

我的测试表明,先将它们聚合到一个数组中会更快一些。我怀疑这是因为强制转换必须解析整个JSON结果。

9.2

9.2没有

json_agg
to_json
功能,因此您需要使用较早的版本
array_to_json

SELECt array_to_json(array_agg(t)) FROM t

您可以选择

row_to_json
在查询中包含呼叫:

SELECt array_to_json(array_agg(row_to_json(t))) FROM t

这会将每一行转换为JSON对象,将JSON对象聚合为一个数组,然后将该数组转换为JSON数组。

我无法分辨两者之间的任何显着性能差异。

清单对象

本节介绍如何生成JSON对象,每个键是表中的一列,每个值是该列的值的数组。结果如下所示:

{"a":[1,2,3], "b":["value1","value2","value3"]}

9.5及以上

我们可以利用该

json_build_object
功能:

SELECt    json_build_object(        'a', json_agg(t.a),        'b', json_agg(t.b)    )FROM t

您还可以聚合列,创建单行,然后将其转换为对象:

SELECt to_json(r)FROM (    SELECt        json_agg(t.a) AS a,        json_agg(t.b) AS b    FROM t) r

请注意,绝对需要对数组使用别名,以确保对象具有所需的名称。

哪一个更清楚是一个意见问题。如果使用该

json_build_object
功能,强烈建议将一对键/值放在一行上以提高可读性。

您也可以

array_agg
代替使用
json_agg
,但我的测试表明
json_agg
速度稍快。

没有

jsonb
json_build_object
功能的版本。您可以将其汇总为一行并进行转换:

SELECt to_jsonb(r)FROM (    SELECt        array_agg(t.a) AS a,        array_agg(t.b) AS b    FROM t) r

与其他针对这种结果的查询不同,使用时

array_agg
似乎要快一些
to_jsonb
。我怀疑这是由于开销分析和验证的JSON结果引起的
json_agg

或者,您可以使用显式强制转换:

SELECt    json_build_object(        'a', json_agg(t.a),        'b', json_agg(t.b)    )::jsonbFROM t

to_jsonb
根据我的测试,该版本可避免转换,而且速度更快;再次,我怀疑这是由于解析和验证结果的开销。

9.4和9.3

json_build_object
功能是9.5的新增功能,因此您必须聚合并转换为先前版本的对象:

SELECt to_json(r)FROM (    SELECt        json_agg(t.a) AS a,        json_agg(t.b) AS b    FROM t) r

要么

SELECt to_jsonb(r)FROM (    SELECt        array_agg(t.a) AS a,        array_agg(t.b) AS b    FROM t) r

这取决于你是否愿意

json
jsonb

(9.3没有

jsonb
。)

9.2

在9.2中甚至不

to_json
存在。您必须使用
row_to_json

SELECt row_to_json(r)FROM (    SELECt        array_agg(t.a) AS a,        array_agg(t.b) AS b    FROM t) r

文献资料

查找在JSON功能的文档JSON功能。

json_agg
在“ 汇总功能”页面上。

设计

如果性能很重要,请确保根据自己的架构和数据对查询进行基准测试,而不要相信我的测试。

它是否是一个好的设计,实际上取决于您的特定应用程序。在可维护性方面,我看不到任何特殊问题。它简化了您的应用程序代码,并意味着该应用程序中需要维护的部分更少。如果PG可以为您提供开箱即用所需的准确结果,那么我认为不使用它的唯一原因就是性能方面的考虑。不要重新发明轮子和所有东西。

空值

聚合函数

NULL
在零行上操作时通常会返回。如果这是可能的话,您可能想使用
COALESCE
避免它们。几个例子:

SELECt COALESCE(json_agg(t), '[]'::json) FROM t

要么

SELECt to_jsonb(COALESCE(array_agg(t), ARRAY[]::t[])) FROM t


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/514898.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号