如何用路径查询嵌套字段和return?

How to query nested fields and return with the path?

对不起我的英语不好和词汇量低。如何用 "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" 且仅 return 那些具有 "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