PostgreSQL jsonb_agg() 函数使用指南
PostgreSQL jsonb_agg()
函数是一个聚合函数,它返回一个包含了一个分组中的所有的值的组成的 JSON 数组。
jsonb_agg()
语法
这里是 PostgreSQL jsonb_agg()
的语法:
jsonb_agg(expr) -> JSON
我们通常在 SQLite 中按如下方式使用 jsonb_agg()
函数:
SELECT jsonb_agg(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];
参数
expr
- 必需的。一个列名或者表达式。
返回值
PostgreSQL jsonb_agg()
函数返回一个 JSON 数组,它包含了指定的一个分组中的指定表达式或者列中的所有值,包括 null。
表达式或者列中的所有值将根据 to_jsonb()
函数转为 JSON 值。
jsonb_agg()
示例
为了演示 PostgreSQL jsonb_agg()
的用法,我们使用以下 UNION
和 SELECT
语句模拟一个表:
SELECT 'Tim' name, 'Football' hobby
UNION
SELECT 'Tim' name, 'Baseball' hobby
UNION
SELECT 'Tom' name, 'Piano' hobby
UNION
SELECT 'Tom' name, 'violin' hobby;
name | hobby
------+----------
Tom | violin
Tom | Piano
Tim | Football
Tim | Baseball
(4 rows)
这里,我们拥有了关于用户业余爱好的一些行。其中 name
列中是用户的姓名, hobby
列中是用户的一个业余爱好。
假如,要想以用户为单位(具有相同名称的用户视为一个用户),将每一个用户的所有业余爱好都放在一个 JSON 数组中,您可以使用 GROUP BY
子句按照 name
分组,并使用 jsonb_agg()
函数将每组中 hobby
的值组成一个 JSON 数组。下面的语句实现了这个需求:
SELECT
t.name,
jsonb_agg(t.hobby) hobbies
FROM (
SELECT 'Tim' name, 'Football' hobby
UNION
SELECT 'Tim' name, 'Baseball' hobby
UNION
SELECT 'Tom' name, 'Piano' hobby
UNION
SELECT 'Tom' name, 'violin' hobby
) t
GROUP BY t.name;
name | hobbies
------+--------------------------
Tim | ["Football", "Baseball"]
Tom | ["violin", "Piano"]
(2 rows)
这里, hobbies
列是一个 JSON 数组,其中包含了一个用户的所有的业余爱好。