【问题标题】:How to query nested fields and return with the path?如何查询嵌套字段并带路径返回?
【发布时间】:2020-06-22 00:50:21
【问题描述】:

对不起,我的英语不好,词汇量少。如何用"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 sql-server sql-server-2016 sql-server-json


    【解决方案1】:

    我希望这不是一个迟到的答案。一种可能的方法(解析输入 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
    

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多