如何用路径查询嵌套字段和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
对不起我的英语不好和词汇量低。如何用 "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