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