我试图从数组结构中提取数字,然后求和。
示例行条目:
{"DBA":50.0},{"RST":132.0},{"ZIT":752}
我想对所有数值求和,这样50+132+752=934
我尝试过的:col=列名
SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX (':', col))) + 1, LEN(col) - LEN(LEFT(col,
CHARINDEX (':', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('}', Benefit))) - 1)
FROM table
在上例中,这可以获取第一个值(因此为50.0(,但不会获取每个值。知道我如何让这个查询获取多个值,然后将它们相加吗?
我个人会将您的数据转换为真正格式良好的JSON。然后你可以很容易地SUM
值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT SUM(TRY_CONVERT(decimal(5,1),[value]))
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString);
或者,您可以将WITH
添加到OPENJSON
调用中,然后添加(+
(值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT OJ.DBA + OJ.RST + OJ.ZIT
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString)
WITH (DBA decimal(5,1),
RST decimal(5,1),
ZIT decimal(5,1)) OJ;
内容几乎是一个有效的JSON,因此您可以尝试修复它,并使用OPENJSON()
(有效的JSON内容是[{"DBA":50.0},{"RST":132.0},{"ZIT":752}]
(通过内置的JSON支持进行解析:
SELECT
t.[Column],
[Sum] = (
SELECT SUM(CONVERT(numeric(10, 1), j2.value))
FROM OPENJSON(CONCAT('[', t.[Column], ']')) j1
CROSS APPLY OPENJSON(j1.[value]) j2
)
FROM (VALUES
('{"DBA":50.0},{"RST":132.0},{"ZIT":752}')
) t ([Column])