如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度
Posted
技术标签:
【中文标题】如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度【英文标题】:how to measure length of array inside array in json file using SQL OPENJSON function with cross APPLY 【发布时间】:2021-01-05 15:26:32 【问题描述】: "table": [
"name": "Emergency",
"columns": [
"name": "ab",
"type": "long"
,
"name": "cd",
"type": "long"
,
"name": "ef",
"type": "long"
,
"name": "gh",
"type": "long"
,
],
"rows": [
[
0.55865,
2.0966,
0.4280,
1.4389
],
[
0.42490,
1.5723,
0.3601,
0.8031
]
]
]
所以在这个 json 中,行内的数组对象可以是多个(超过 2 个)。那么如何使用 OPENJSON SQL Server 函数计算数组 sinde 'rows' 的对象。
我所做的是,将此json存储到临时表#TempAb中,然后
DECLARE @ab VARCHAR(MAX);
DECLARE @cd VARCHAR(MAX);
DECLARE @ef VARCHAR(MAX);
DECLARE @gh VARCHAR(MAX);
SELECT @ab=ab,@cd=cd,@ef=ef,@gh=gh from #TempAb as ab CROSS APPLY
OPENJSON(ab.RawData, '$.table') WITH
(
ab Varchar(MAX) '$.rows[0][0],
cd Varchar(Max) '$.rows[0][1],
ef Varchar(Max) '$.rows[0][2],
gh Varchar(Max) '$.rows[0][3]
);
所以这个查询只返回行的第一个对象的数据,但我想要所有行对象的数据。所以我知道计数然后在while循环中迭代它
解决方案:
SET @cnt_total = (SELECT COUNT(O.[key]) FROM (VALUES(@jsonvalue))V(J)
CROSS APPLY OPENJSON(V.J)
WITH([Object] nvarchar(MAX) '$.table[0].rows' AS JSON) M
CROSS APPLY OPENJSON(M.[Object]) O)
【问题讨论】:
【参考方案1】:首先你必须从有效的 JSON 开始,然后是这样的:
declare @json nvarchar(max) = N'
"table": [
"name": "Emergency",
"columns": [
"name": "ab",
"type": "long"
,
"name": "cd",
"type": "long"
,
"name": "ef",
"type": "long"
,
"name": "gh",
"type": "long"
],
"rows": [
[
0.55865,
2.0966,
0.4280,
1.4389
],
[
0.42490,
1.5723,
0.3601,
0.8031
]
]
]
'
select count(*) from
OPENJSON(@json, '$.table[0].rows') d
【讨论】:
以上是关于如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度的主要内容,如果未能解决你的问题,请参考以下文章
如何反转 SQL Server 中的 OPENJSON() 函数?
如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?