Json 如何查询嵌套字段并返回路径?
对不起,我英语不好,词汇量低。如何筛选出所有具有Json 如何查询嵌套字段并返回路径?,json,sql-server,sql-server-2016,sql-server-json,Json,Sql Server,Sql Server 2016,Sql Server Json,对不起,我英语不好,词汇量低。如何筛选出所有具有“Properties.Searchable”=“true”属性的字段?这些字段可以是另一个字段的子字段 以下是一个示例(删除了大部分不必要的数据): 我需要查询“Configuration.Fields”,只返回那些具有“Properties.Searchable”=“true”属性的字段的路径。结果应该与此类似或接近: Id PersonalInfo.Name.GivenName PersonalInfo.Name.FamilyName 谢谢
“Properties.Searchable”=“true”
属性的字段?这些字段可以是另一个字段的子字段
以下是一个示例(删除了大部分不必要的数据):
我需要查询“Configuration.Fields”
,只返回那些具有“Properties.Searchable”=“true”
属性的字段的路径。结果应该与此类似或接近:
Id
PersonalInfo.Name.GivenName
PersonalInfo.Name.FamilyName
谢谢 我希望这不是一个迟到的回答。一种可能的方法(解析输入JSON并获得预期结果)是以下递归CTE: JSON: 声明:
;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
;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