>我有一个包含两列的表格:id
和values
。values
列是一个 json 数组,其中包含n
个元素,每个元素都是一个 json 对象。json对象有两个属性a
和b
,两者都是浮点数。我正在尝试编写一个查询,该查询汇总所有行中 json 数组values
处的第一个索引处的a
属性。然后它对属性b
做同样的事情。此外,它应该对所有索引中的所有 json 对象执行此操作。这可能吗?我知道您可以在SQL Server中操作和查询json列(这就是我正在使用的),但是无法弄清楚实现此目的的方法。
例
下面是一个示例,说明了我想要实现的目标。假设我们有以下行:
id | |
---|---|
1 | > |
2 | ;">[{"a": 3, "b": 6}, {"a": 4, "b": 8}] |
3 | > |
4 | ;">[{"a": 7, "b": 14}, {"a": 8, "b": 16}] |
您需要分解单独的a
和b
值,然后重建 JSON。
如果你有固定数量的索引,那么你可以很容易地使用JSON_VALUE(values, '$[0].a')
等,但由于数组中有任意数量的对象,你需要用OPENJSON
将数组切成单独的行
SELECT
a = SUM(CAST(JSON_VALUE(j.[value], '$.a') AS int)),
b = SUM(CAST(JSON_VALUE(j.[value], '$.b') AS int))
FROM YourTable t
CROSS APPLY OPENJSON(t.[values]) j -- with no path then [key] is the array index, [value] is the object
GROUP BY CAST(j.[key] AS int)
ORDER BY CAST(j.[key] AS int)
FOR JSON AUTO;
你应该阅读 JSON_VALUE(),因为它是这里所需要的。路径将为'$[0].a'
或'$[0].b'
。
这是一个 SQL Fiddle 示例,可以实现您所追求的目标。