JSON_ARRAYAGG (Transact-SQL)

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

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

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

json 聚合函数JSON_OBJECTAGG,适用于 JSON_ARRAYAGG Azure SQL 数据库、Azure SQL 托管实例(配置了 Always-up-to-date 更新策略)、Microsoft Fabric 和 Fabric 数据仓库中的 SQL 数据库。

Transact-SQL 语法约定

Syntax

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>

Arguments

value_expression

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

json_null_clause

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

order_by_clause

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

Examples

Example 1

以下示例返回空 JSON 数组。

SELECT JSON_ARRAYAGG(NULL);

Result

[]

Example 2

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

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

Result

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

Example 3

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

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

Result

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

Example 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;

Result

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"]

Example 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), ());

Result

id 类型 total_amount json_total_name_amount
1 a 2 [2]
NULL a 2 [2]
1 b 7 [4,3]
NULL b 7 [4,3]
2 d 16 [9,7]
NULL d 16 [9,7]
NULL NULL 25 [2,4,3,9,7]
1 NULL 9 [3,4,2]
2 NULL 16 [9,7]