Sql 在select into期间更改json_值的数据类型,以便我可以对列求和
我在表中有一列是json。它包含多个列 例如:Sql 在select into期间更改json_值的数据类型,以便我可以对列求和,sql,json,sql-server,tsql,Sql,Json,Sql Server,Tsql,我在表中有一列是json。它包含多个列 例如: 第1行:“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3033244.0} 第2行:“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3.3} 我需要对表中所有行的cnt值求和 我对存储过程不太熟悉,无法掌握。我认为最简单的方法是创建一个临时表,将值提取到列中,然后编写一个查询来求和列值 问题是它创建了一个数据类型为nvarchar(4000)的列。它不允许我对
- 第1行:
“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3033244.0}
- 第2行:
“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3.3}
nvarchar(4000)
的列。它不允许我对该列求和。我曾想过更改数据类型,但不确定如何更改。我正在尝试CAST
,但运气不好
select CAST(json AS varchar) AS JSON_VALUE(jsontext,
'$.sTCounts.cnt') AS PerfCount, TitleNumber
INTO dbo_Testing_Count0
from PerformanceTest
select sum(PerfCount)
from dbo_Testing_Count
Group by PerfCount
错误消息是:
“jsontext”附近的语法不正确
有什么想法吗?我愿意接受另一种方法来对列求和或更改数据类型,只要专家能够提供帮助。我很感激。您在问题中提供的JSON无效……这似乎只是一个更大的JSON的片段。因为您的数据以
[
您必须将其视为一个数组,因此简单的json路径'$.serviceTierCounts.cnt'
可能无法工作
试试这个,我在结尾添加了开头的{和结尾的括号:
DECLARE @mockupTable TABLE(ID INT IDENTITY, YourJson NVARCHAR(MAX));
INSERT INTO @mockupTable VALUES
(N'{"serviceTierCounts":[{"dpsType":"TRIAL","cnt":3033244.0}]}')
,(N'{"serviceTierCounts":[{"dpsType":"TRIAL","cnt":3.3}]}');
--您可以使用强制转换直接使用JSON\u value
读取一个标量值。但在这种情况下,我需要添加[0]
。这将告诉引擎读取第一个(基于零的索引!)对象的cnt
属性
SELECT CAST(JSON_VALUE(YourJson,'$.serviceTierCounts[0].cnt') AS DECIMAL(14,4))
FROM @mockupTable
--但我认为,这就是你想要的:
SELECT *
FROM @mockupTable
CROSS APPLY OPENJSON(YourJson,'$.serviceTierCounts')
WITH(dpsType varchar(100)
,cnt decimal(14,4));
WITH
子句将在键入的列中并排返回对象
为了便于继续,您可以将其包装为CTE,并在以下选择中继续设置。错误位于
JSONTEXT
,而不是您的SUM
。您将强制转换(json为varchar)为json_值(JSONTEXT,'$.serviceTierCounts.cnt')作为PerformanceCount,
这没有什么意义。看起来您忘记了第一个后面的别名为。此外,永远不要声明varchar
,也不要声明它的长度。另外,如果“$.serviceTierCounts.cnt”
返回一个整数值,请在中选择或使用转换OPENJSON
使用with
来定义JSON数据的结构。谢谢。我会处理这些,如果我弄明白了,请为其他人发帖。谢谢