Oracle SQL中如何对JSON数组的totalCapacity值求和?
解决JSON数组字段中totalCapacity的求和问题
你的问题出在JSON_VALUE无法直接处理JSON数组结构——它只能提取单个标量值,直接用$.totalCapacity路径匹配数组时会返回null,最终SUM(null)自然也是null。需要先把JSON数组拆分成独立行,再对每行的totalCapacity求和,以下是不同数据库的实现方案:
SQL Server 方案
使用OPENJSON解析JSON数组,将数组中的每个对象拆分为单独的行,再分组求和:
SELECT a.id, a.country, a.city, SUM(CAST(j.totalCapacity AS DECIMAL(10,2))) AS total_capacity FROM A a CROSS APPLY OPENJSON(a.capacity) WITH (totalCapacity DECIMAL(10,2) '$.totalCapacity') j GROUP BY a.id, a.country, a.city;
MySQL 方案
使用JSON_TABLE函数展开JSON数组,再进行求和:
SELECT a.id, a.country, a.city, SUM(j.totalCapacity) AS total_capacity FROM A a JOIN JSON_TABLE( a.capacity, '$[*]' COLUMNS(totalCapacity DECIMAL(10,2) PATH '$.totalCapacity') ) j GROUP BY a.id, a.country, a.city;
PostgreSQL 方案
使用jsonb_array_elements(或json_array_elements,根据字段类型是jsonb还是json)展开数组,再聚合求和:
SELECT a.id, a.country, a.city, SUM((j.obj->>'totalCapacity')::DECIMAL(10,2)) AS total_capacity FROM A a CROSS JOIN LATERAL jsonb_array_elements(a.capacity) j(obj) GROUP BY a.id, a.country, a.city;
以上方案都会先将JSON数组中的每个totalCapacity值拆分为独立行,再对同一id、country、city的行求和,最终得到你需要的结果。
内容的提问来源于stack exchange,提问作者Surbhi Jain
相关产品推荐
相关产品推荐

