json - 如何查询嵌套字段并带路径返回?
问题描述
对不起我的英语不好和词汇量低。如何过滤掉所有字段"Properties.Searchable" = "true"
?这些字段可以是另一个字段的子字段。
这是一个示例(删除了大部分不必要的数据):
{
"Configuration": {
"Fields": {
"Id": {
"Properties": {
"DataType": "string",
"Searchable": "true"
}
},
"PrsonalInfo": {
"BirthDate": {
"Properties": {
"DataType": "date",
"Searchable": "false"
}
},
"Name": {
"GivenName": {
"Properties": {
"DataType": "string",
"Searchable": "true"
}
},
"FamilyName": {
"Properties": {
"DataType": "string",
"Searchable": "true"
}
}
}
}
}
}
}
我需要查询"Configuration.Fields"
并只返回那些有的路径"Properties.Searchable" = "true"
。结果应该类似于或接近此:
Id
PersonalInfo.Name.GivenName
PersonalInfo.Name.FamilyName
谢谢!
解决方案
我希望这不是一个迟到的答案。一种可能的方法(解析输入 JSON 并获得预期结果)是以下递归 CTE:
JSON:
DECLARE @json nvarchar(1000) = N'{
"Configuration":{
"Fields":{
"Id":{
"Properties":{
"DataType":"string",
"Searchable":"true"
}
},
"PrsonalInfo":{
"BirthDate":{
"Properties":{
"DataType":"date",
"Searchable":"false"
}
},
"Name":{
"GivenName":{
"Properties":{
"DataType":"string",
"Searchable":"true"
}
},
"FamilyName":{
"Properties":{
"DataType":"string",
"Searchable":"true"
}
}
}
}
}
}
}'
陈述:
;WITH rCTE AS (
SELECT
CONVERT(nvarchar(max), N'$') COLLATE DATABASE_DEFAULT AS JsonPath,
CONVERT(nvarchar(max), N'$') COLLATE DATABASE_DEFAULT AS JsonKey,
CONVERT(nvarchar(max), JSON_QUERY(@json, '$.Configuration.Fields')) COLLATE DATABASE_DEFAULT AS JsonValue
UNION ALL
SELECT
CONVERT(nvarchar(max), CONCAT(r.JsonPath, CONCAT(N'.', c.[key]))) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[key]) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[value]) COLLATE DATABASE_DEFAULT
FROM rCTE r
CROSS APPLY OPENJSON(r.JsonValue) c
WHERE ISJSON(r.JsonValue) = 1
)
SELECT JsonPath
FROM rCTE
WHERE
CASE
WHEN ISJSON(JsonValue) = 1 THEN JSON_VALUE(JsonValue, '$.Properties.Searchable')
ELSE N''
END = N'true'
结果:
JsonPath
-----------------------------
$.Id
$.PrsonalInfo.Name.GivenName
$.PrsonalInfo.Name.FamilyName
推荐阅读
- r - 绘制矩阵 ggplot2 的行
- java - 只收集第一个索引
- python - 打印包含用户定义对象的列表返回地址并在 python 中实现复数的根
- javascript - Keccak -f Round constants 十六进制转二进制不是一个位
- python - ValueError: x 和 y 必须具有相同的第一维,但具有形状 (10,) 和 (1, 10)
- apache-spark - 在 Windows 操作系统上安装 Apache-Airflow 时出错
- python - 需要帮助获得一个while循环来处理python中的列表
- java - 由于类别数据太长,通过 JavaFx 使用 Slider 创建引人注目的 BarChart 以查看
- python - keras 已安装但无法加载
- r - R:我们可以对带有条件的向量求和吗?