JSON_ARRAYAGG(Transact-SQL)

适用于:SQL Server 2025 (17.x) 在Microsoft Fabric 中预览 Azure SQL 数据库Azure SQL 托管实例 SQL 数据库

通过聚合 SQL 数据或列来构造 JSON 数组。 还可以在 SELECT 语句中使用 GROUP BY GROUPING SETS 子句JSON_ARRAYAGG。

若要改为通过聚合来创建 JSON 对象,请使用 JSON_OBJECTAGG

注意

json 聚合函数JSON_OBJECTAGGJSON_ARRAYAGG正式版都可用于 Azure SQL 数据库、Azure SQL 托管实例(配置了 Always-up-to-date 更新策略)和 Microsoft Fabric 数据仓库。

Transact-SQL 语法约定

语法

JSON_ARRAYAGG (value_expression [ order_by_clause ] [ json_null_clause ] )

json_null_clause ::=  NULL ON NULL | ABSENT ON NULL

order_by_clause ::= ORDER BY <column_list>

参数

value_expression

值表达式可以是列或查询或常量/文本中的表达式。

json_null_clause

可选。 json_null_clause 可用于控制 JSON_ARRAYAGG 函数在 value_expressionNULL 时的行为。 在生成 JSON 数组中的元素值时,选项 NULL ON NULL 将 SQL NULL 值转换为 JSON null 值。 如果值为 ABSENT ON NULL,选项 NULL 将省略 JSON 数组中的元素。 如果省略,则 ABSENT ON NULL 为默认值。

order_by_clause

可选。 可以指定所生成 JSON 数组中的元素顺序,以便对输入的行进行排序,从而实现聚合。

示例

示例 1

以下示例返回空 JSON 数组。

SELECT JSON_ARRAYAGG(NULL);

结果

[]

示例 2

以下示例构建具有三个来自结果集的元素的 JSON 数组。

SELECT JSON_ARRAYAGG(c1)
FROM (VALUES ('c'), ('b'), ('a')) AS t(c1);

结果

["c","b","a"]

示例 3

以下示例将构造一个 JSON 数组,其中包含三个按列值排序的元素。

SELECT JSON_ARRAYAGG( c1 ORDER BY c1)
FROM (
    VALUES ('c'), ('b'), ('a')
) AS t(c1);

结果

["a","b","c"]

示例 4

以下示例返回包含两列的结果。 第一列包含 object_id 值。 第二列包含一个 JSON 数组,其中包含列的名称。 JSON 数组中的列根据 column_id 值进行排序。

SELECT TOP(5) c.object_id, JSON_ARRAYAGG(c.name ORDER BY c.column_id) AS column_list
FROM sys.columns AS c
GROUP BY c.object_id;

结果

对象标识符 column_list
3 ["rsid","rscolid","hbcolid","rcmodified","ti","cid","ordkey","maxinrowlen","status","offset","nullbit","bitpos","colguid","ordlock"]
5 ["rowsetid","ownertype","idmajor","idminor","numpart","status","fgidfs","rcrows","cmprlevel","fillfact","maxnullbit","maxleaf","maxint","minleaf","minint","rsguid","lockres","scope_id"]
6 ["id","subid","partid","version","segid","cloneid","rowsetid","dbfragid","status"]
7 ["auid","type","ownerid","status","fgid","pgfirst","pgroot","pgfirstiam","pcused","pcdata","pcreserved"]
8 ["status","fileid","name","filename"]

示例 5

以下示例返回一个结果,其中包含 SUM 的 SELECT 语句中的四列,并使用 GROUP BY GROUPING SETS JSON_ARRAYAGG聚合。 前两列返回和idtype列值。 第三列 total_amount 返回列上的 amount SUM 聚合值。 第四列 json_total_amount 返回列上的 amount JSON_ARRAYAGG聚合的值。

WITH T
AS (SELECT *
    FROM (VALUES (1, 'k1', 'a', 2), (1, 'k2', 'b', 3), (1, 'k3', 'b', 4), (2, 'j1', 'd', 7), (2, 'j2', 'd', 9)) AS b(id, name, type, amount))
SELECT id,
       type,
       SUM(amount) AS total_amount,
       JSON_ARRAYAGG(amount) AS json_total_amount
FROM T
GROUP BY GROUPING SETS((id), (type), (id, type), ());

结果

id 类型 total_amount json_total_name_amount
1 一个 2 [2]
NULL 一个 2 [2]
1 b 7 [4,3]
NULL b 7 [4,3]
2 d 16 [9,7]
NULL d 16 [9,7]
NULL NULL 二十五 [2,4,3,9,7]
1 NULL 9 [3,4,2]
2 NULL 16 [9,7]