首页 >数据库 >mysql教程 >如何在 PostgreSQL 中高效地检索多个列作为 JSON 对象数组?

如何在 PostgreSQL 中高效地检索多个列作为 JSON 对象数组?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-14 21:51:43543浏览

How to Efficiently Retrieve Multiple Columns as a JSON Array of Objects in PostgreSQL?

PostgreSQL:从多列生成对象的 JSON 数组

本指南演示了如何通过单列有效地将 PostgreSQL 表中的行分组,并将其余列聚合到 JSON 对象数组中。 让我们考虑一下 MyTable 示例:

<code>| id | value_two | value_three | value_four |
|---|---|---|---|
| 1 | a | A | AA |
| 2 | a | A2 | AA2 |
| 3 | b | A3 | AA3 |
| 4 | a | A4 | AA4 |
| 5 | b | A5 | AA5 |</code>

目标是产生如下输出:

<code>| value_two | value_four |
|---|---|
| a | [{"value_three":"A","value_four":"AA"}, {"value_three":"A2","value_four":"AA2"}, {"value_three":"A4","value_four":"AA4"}]
| b | [{"value_three":"A3","value_four":"AA3"}, {"value_three":"A5","value_four":"AA5"}]</code>

请注意,更简单的聚合方法通常在 JSON 对象中包含 id 和分组列 (value_two),这是我们希望避免的。

以下是针对不同PostgreSQL版本的优化方案:

PostgreSQL 10 及更高版本:

利用 - 运算符排除不需要的键:

<code class="language-sql">SELECT value_two, jsonb_agg(to_jsonb(t.*) - '{id, value_two}'::text[]) AS value_four
FROM   MyTable t
GROUP  BY value_two;</code>

PostgreSQL 9.4 及更高版本:

使用jsonb_build_object()来精确控制键值对:

<code class="language-sql">SELECT value_two, jsonb_agg(jsonb_build_object('value_three', value_three, 'value_four', value_four)) AS value_four
FROM   MyTable
GROUP  BY value_two;</code>

PostgreSQL 9.3 及更高版本:

使用 to_jsonb() 与行表达式:

<code class="language-sql">SELECT value_two, jsonb_agg(to_jsonb(row(value_three, value_four))) AS value_four
FROM   MyTable
GROUP  BY value_two;</code>

这些方法提供了高效、简洁的方法来生成所需的 JSON 输出,避免不必要的密钥并适应各种 PostgreSQL 版本。 选择与您的数据库版本兼容的方法以获得最佳性能。

以上是如何在 PostgreSQL 中高效地检索多个列作为 JSON 对象数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn