按兄弟 属性 的值过滤 JSON 数据
Filter JSON data by a sibling property's value
示例数据设置:
DECLARE @Data TABLE (Id INT IDENTITY(1,1), JSONData NVARCHAR(MAX))
INSERT INTO @Data
VALUES ( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "John"
},
{
"propId": 0,
"propName": "lName",
"val": "Doe",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "1010101010"
},
{
"propId": 0,
"propName": "mobilePhone",
"val": "010101010101"
}
]
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "true"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ),
( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "Joe"
},
{
"propId": 0,
"propName": "lName",
"val": "Harris",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "2020202020"
}
]
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "true"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "true"
}
]
}' ), (N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "Olivia"
},
{
"propId": 0,
"propName": "lName",
"val": "Smith"
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "false"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ),( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "George"
},
{
"propId": 0,
"propName": "lName",
"val": "Hart",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "3030303030"
},
{
"propId": 0,
"propName": "mobilePhone",
"val": "030303030303"
}
]
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ) ;
SELECT [Id]
, [JSONData]
FROM @Data
-- WHERE [JSONData].dataDump.propName = 'isAuthorized'
-- AND [JSONData].dataDump.val = 'true'
目标:
到具有“[JSONData].dataDump.propName”= 'isAuthorized' 和“[[=] 的记录的 return Id 和 JSON 39=]数据].dataDump.val" = 'true'
预期输出:
第 1 条和第 2 条记录应该 returned,因为尽管第 3 条记录有“[JSONData].dataDump.propName”= 'isAuthorized',但它没有有它的“[JSONData].dataDump.val”= 'true'(它是 'false')而第 4 条记录甚至没有这个 属性.
我完全不熟悉在 SQL 服务器中解析 JSON,没有找到按同级值过滤的类似示例。
我的(未成功)尝试:
SELECT *
FROM @Data AS [T]
CROSS APPLY
OPENJSON ( [T].[JSONData], '$.dataDump' )
WITH
( [propName] NVARCHAR ( 100 )
, [val] NVARCHAR ( MAX ) AS JSON ) AS [dat]
WHERE [dat].[propName] = 'isAuthorized'
AND [dat].[val] = 'true' ;
这似乎 return 没有任何数据。
非常接近,但是 val
只是一个类似于 propName
的字符串。所以
SELECT *
FROM @Data
cross apply openjson(JSONData,'$.dataDump')
with
(
propName nvarchar(200),
val nvarchar(200)
)
where propName = 'isAuthorized'
and val = 'true'
示例数据设置:
DECLARE @Data TABLE (Id INT IDENTITY(1,1), JSONData NVARCHAR(MAX))
INSERT INTO @Data
VALUES ( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "John"
},
{
"propId": 0,
"propName": "lName",
"val": "Doe",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "1010101010"
},
{
"propId": 0,
"propName": "mobilePhone",
"val": "010101010101"
}
]
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "true"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ),
( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "Joe"
},
{
"propId": 0,
"propName": "lName",
"val": "Harris",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "2020202020"
}
]
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "true"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "true"
}
]
}' ), (N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "Olivia"
},
{
"propId": 0,
"propName": "lName",
"val": "Smith"
},
{
"propId": 0,
"propName": "isAuthorized",
"val": "false"
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ),( N'
{
"propId": 0,
"propName": "Helo.World",
"dataDump": [ {
"propId": 0,
"propName": "fName",
"val": "George"
},
{
"propId": 0,
"propName": "lName",
"val": "Hart",
"dataDump": [ {
"propId": 0,
"propName": "homePhone",
"val": "3030303030"
},
{
"propId": 0,
"propName": "mobilePhone",
"val": "030303030303"
}
]
},
{
"propId": 0,
"propName": "isFullAccess",
"val": "false"
}
]
}' ) ;
SELECT [Id]
, [JSONData]
FROM @Data
-- WHERE [JSONData].dataDump.propName = 'isAuthorized'
-- AND [JSONData].dataDump.val = 'true'
目标:
到具有“[JSONData].dataDump.propName”= 'isAuthorized' 和“[[=] 的记录的 return Id 和 JSON 39=]数据].dataDump.val" = 'true'
预期输出:
第 1 条和第 2 条记录应该 returned,因为尽管第 3 条记录有“[JSONData].dataDump.propName”= 'isAuthorized',但它没有有它的“[JSONData].dataDump.val”= 'true'(它是 'false')而第 4 条记录甚至没有这个 属性.
我完全不熟悉在 SQL 服务器中解析 JSON,没有找到按同级值过滤的类似示例。
我的(未成功)尝试:
SELECT *
FROM @Data AS [T]
CROSS APPLY
OPENJSON ( [T].[JSONData], '$.dataDump' )
WITH
( [propName] NVARCHAR ( 100 )
, [val] NVARCHAR ( MAX ) AS JSON ) AS [dat]
WHERE [dat].[propName] = 'isAuthorized'
AND [dat].[val] = 'true' ;
这似乎 return 没有任何数据。
非常接近,但是 val
只是一个类似于 propName
的字符串。所以
SELECT *
FROM @Data
cross apply openjson(JSONData,'$.dataDump')
with
(
propName nvarchar(200),
val nvarchar(200)
)
where propName = 'isAuthorized'
and val = 'true'