sql - 如何使用具有未确定/动态路径的嵌套 JSON 的 OPENJSON 方法?
问题描述
我正在使用以动态 json 形式输出数据的 API,即 json 对象的某些元素的位置不固定,这导致 json 数组中的某些元素的路径是动态的。例如在 JSON 对象下面的“Property”数组下可以属于 n 级嵌套。OPENJSON 是否有任何搜索/查找功能,可以找到名称为“Property”的数组的位置并且只需将元素打印到表中?
这是工作模型,但我必须对数组使用强制索引 ('$.rows[2]') 以显示所需的结果。但是,Property 数组可以在任何地方。
JSON
Declare @Jsonobj as nvarchar(max)
Select @Jsonobj = N'{
"ID": "StudentInformation",
"Name": "Student Information",
"Type": "s_info",
"Details": [
"Student Information",
"Greendale Community College"
],
"Date": "21 October 2021",
"Rows": [
{
"RowType": "Header",
"Cells": [
{
"Value": ""
},
{
"Value": "21 Feb 2021"
},
{
"Value": "22 Aug 2020"
}
]
},
{
"RowType": "Section",
"Title": "Class",
"Rows": []
},
{
"RowType": "Section",
"Title": "Grade",
"Rows": [
{
"RowType": "Row",
"Cells": [
{
"Value": "5A",
"Property": [
{
"Id": "1",
"Value": "John Smith"
}
]
},
{
"Value": "5A",
"Property": [
{
"Id": "2",
"Value": "Jane Doe"
}
]
},
{
"Value": "5B",
"Property": [
{
"Id": "1",
"Value": "Ben Frank"
}
]
}
]
}
]
}
]
}'
SQL
SELECT JSON_VALUE(v.value, 'strict $.Value') as Names
FROM OPENJSON(@Jsonobj, 'strict $.Rows[2].Rows') c
CROSS APPLY OPENJSON(c.value, 'strict $.Cells') p
CROSS APPLY OPENJSON(p.value, 'strict $.Property') v
解决方案
这是我发现的有效方法:
SELECT d.value Names
FROM OPENJSON(@Jsonobj,'$.Rows')
WITH([Rows] NVARCHAR(MAX) AS JSON) A
OUTER APPLY OPENJSON(A.[Rows]) B
OUTER APPLY OPENJSON(B.[value],'$.Cells') C
OUTER APPLY OPENJSON(c.[value],'$.Property') WITH (Value NVARCHAR(MAX)) d
where d.value is not null
推荐阅读
- python - 相同的数据产生不同的熊猫图
- c - 关于 CS50 问题集 1 学分 - 所有输入都返回“无效”
- python - 如何在 python 中抓取动态网站(不使用 selenium)
- python - `built-in method numpy.core._multiarray_umath.implement_array_function` 是性能瓶颈吗?
- c++ - 在 C++ 中按类成员的顺序对包含类对象的向量进行排序
- c++ - 在函数中按值传递 unordered_map/unordered_set 是否有效?C++
- angular - 模块在构建 Angular 9 库时从未使用过警告
- algorithm - 定义算法
- docker - Openshift 零停机部署 react + rest api
- javascript - CSS - 多行的粘性定位