我在ORACLE中有以下查询:
SELECT *
FROM "Supplier" s
OUTER APPLY(
SELECT JSON_ARRAYAGG(JSON_OBJECT(p."Id", p."Description", p."Price")) as "Products"
FROM "Products" p
WHERE p."SupplierId" = s."Id"
) sp
在OUTER APPLY
子查询中,我从我需要的列创建json,然后将这些对象聚合到json数组中。我需要这两个函数,因为有时候我只使用其中一个。我想在SqlServer中做同样的操作。这是我到目前为止管理的解决方案:
SELECT *
FROM "Supplier" as s
OUTER APPLY(
SELECT p."Id", p."Description", p."Price"
FROM "Products" as p
WHERE p."SupplierId" = s."Id"
FOR JSON PATH
) as sp("Products")
问题是SqlServer同时执行这两个函数(这是FOR JSON PATH
语句的目的)。
1)有没有可能创建json对象而不将其 Package 到数组中(类似oracle的语法)?
2)有没有可能把json对象聚合到一个数组中?
更新我正在使用SqlServer版本2019 15.0.2000.5
预期结果(json格式的产品单条记录)
"Products":{
"Id":"FEB0646B709B45B5A306E10599716F28",
"Description":"Database Manager",
"Price":149.99
}
2条答案
按热度按时间brccelvz1#
如果我对问题的理解正确的话,下面的陈述是可能的解答(当然,它们是基于问题中的示例数据和陈述):
如何创建单个JSON对象:
如果要生成一个JSON对象,则需要在
OUTER APPLY
语句中的每一行使用FOR JSON PATh
和相应的path
表达式。需要JSON_QUERY()
,因为它返回有效的JSON,并且FOR JSON
不会转义特殊字符。数据表:
声明:
结果:
如何将JSON对象聚合到数组中:
默认情况下,
FOR JSON
会创建一个JSON数组,每行包含一个JSON对象。声明:
结果:
6ovsh4lw2#