适用于:Microsoft Fabric 中的 SQL Server 2025 (17.x)
Azure SQL 数据库
Azure SQL 托管实例 SQL 数据库
该 JSON_OBJECTAGG 语法从 SQL 数据或列的聚合构造 JSON 对象。
JSON_OBJECTAGG也可以在包含SELECT子句的GROUP BY GROUPING SETS语句中使用。
键值对可以被指定为输入值、列、变量引用。
Note
若要改为从聚合创建 JSON 数组,请使用 JSON_ARRAYAGG。
json 聚合函数JSON_OBJECTAGG和JSON_ARRAYAGG以下函数:
适用于 Azure SQL 数据库、Azure SQL 托管实例(SQL Server 2025 或 Always-up-to-dateupdate policy**)、Microsoft Fabric 和 Fabric 数据仓库中的 SQL 数据库。
SQL Server 2025 (17.x) 预览版。
Syntax
JSON_OBJECTAGG ( json_key_value [ json_null_clause ] [ RETURNING json ] )
json_key_value ::= <json_name> : <value_expression>
json_null_clause ::= NULL ON NULL | ABSENT ON NULL
Arguments
json_key_value
JSON 对象的键值对。
json_null_clause
Optional. 如果值为 NULL,则省略对象的整个属性,或使用 JSON null 作为属性值。 如果省略,则 NULL ON NULL 为默认值。
返回值
返回 nvarchar(max) 类型的有效 JSON 对象字符串。 如果包含该 RETURNING json 选项,则 JSON 对象将作为 json 类型返回。
Examples
A. 返回包含一个键的 JSON 对象
以下示例返回包含一个键和 null 值的 JSON 对象。
SELECT JSON_OBJECTAGG('key':NULL);
结果集如下。
{"key":null}
B. 从结果集中构造 JSON 对象
以下示例使用结果集中的三个属性来构造 JSON 对象。
SELECT JSON_OBJECTAGG(c1:c2)
FROM (
VALUES('key1', 'c'), ('key2', 'b'), ('key3', 'a')
) AS t(c1, c2);
结果集如下。
{"key1":"c","key2":"b","key3":"a"}
C. 返回包含两列的结果
以下示例返回包含两列的结果。 第一列包含 object_id 值。 第二列包含一个 JSON 对象,其中键为列名,值为 column_id。
SELECT TOP (5) c.object_id,
JSON_OBJECTAGG(c.name:c.column_id) AS columns
FROM sys.columns AS c
GROUP BY c.object_id;
D. 将 JSON 对象作为 JSON 类型返回
以下示例将 JSON 对象作为 json 类型返回。
SELECT JSON_OBJECTAGG('a':1 RETURNING JSON);
结果
{"a":1}
结果集如下。
| object_id | column_list |
|---|---|
| 3 | {"bitpos":12,"cid":6,"colguid":13,"hbcolid":3,"maxinrowlen":8,"nullbit":11,"offset":10,"ordkey":7,"ordlock":14,"rcmodified":4,"rscolid":2,"rsid":1,"status":9,"ti":5} |
| 5 | {"cmprlevel":9,"fgidfs":7,"fillfact":10,"idmajor":3,"idminor":4,"lockres":17,"maxint":13,"maxleaf":12,"maxnullbit":11,"minint":15,"minleaf":14,"numpart":5,"ownertype":2,"rcrows":8,"rowsetid":1,"rsguid":16,"scope_id":18,"status":6} |
| 6 | {"cloneid":6,"dbfragid":8,"id":1,"partid":3,"rowsetid":7,"segid":5,"status":9,"subid":2,"version":4} |
| 7 | {"auid":1,"fgid":5,"ownerid":3,"pcdata":10,"pcreserved":11,"pcused":9,"pgfirst":6,"pgfirstiam":8,"pgroot":7,"status":4,"type":2} |
| 8 | {"fileid":2,"filename":4,"name":3,"status":1} |
E. 返回包含四列的聚合结果
以下示例返回一个结果,其中包含一个 SELECT 语句 SUM 中的四列,其中包含和 JSON_OBJECTAGG 聚合的列 GROUP BY GROUPING SETS。 前两列返回和idtype列值。 第三列total_amount返回列上的SUM聚合值amount。 第四列json_total_name_amount返回对列JSON_OBJECTAGGname的amount聚合值。
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_OBJECTAGG(name:amount) AS json_total_name_amount
FROM T
GROUP BY GROUPING SETS((id), (type), (id, type), ());
结果集如下。
| id | 类型 | total_amount | json_total_name_amount |
|---|---|---|---|
| 1 | a | 2 | {"k1":2} |
NULL |
a | 2 | {"k1":2} |
| 1 | b | 7 | {"k3":4,"k2":3} |
NULL |
b | 7 | {"k3":4,"k2":3} |
| 2 | d | 16 | {"j2":9,"j1":7} |
NULL |
d | 16 | {"j2":9,"j1":7} |
NULL |
NULL |
25 | {"k1":2,"k3":4,"k2":3,"j2":9,"j1":7} |
| 1 | NULL |
9 | {"k2":3,"k3":4,"k1":2} |
| 2 | NULL |
16 | {"j2":9,"j1":7} |