sql - 按兄弟属性的值过滤 JSON 数据
问题描述
示例数据设置:
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' 和 "[JSONData].dataDump.val" = 'true' 的记录的 Id 和 JSON
预期输出:
应该返回第一条和第二条记录,因为尽管第三条记录有“[JSONData].dataDump.propName”='isAuthorized',但是它没有它的“[JSONData].dataDump.val”='true'(它是'false ') 和第四条记录甚至没有这个属性。
我对在 SQL Server 中解析 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' ;
这似乎没有返回任何数据。
解决方案
非常接近,但val
只是一个字符串,如propName
. 所以
SELECT *
FROM @Data
cross apply openjson(JSONData,'$.dataDump')
with
(
propName nvarchar(200),
val nvarchar(200)
)
where propName = 'isAuthorized'
and val = 'true'
推荐阅读
- sql - SQL 将 (-) 符号放在我的输出前面
- php - 无法使用 Swig 从 PHP 中的类函数中获取 int 值
- identity - Azure KeyVault Vm 扩展和 MSI
- excel - 如何从工作表中提取数据(无标题)并添加到 csv 文件的底部(无需在 excel 中打开,包含 3.6m+ 行)
- kernel - 哪个内核在 Linux 之前用于开发 GNU 工具?
- bash - 防止 Bash 破坏带引号的字符串
- java - 如何修复 netlogo 无头模式下的 JNI 错误?
- .net - Xamarin.Forms + .resx string resources - System.IO.FileNotFoundException: Invalid Image
- sql - 使用其他表中的值查找重复项
- python-3.x - 术语文档矩阵手动实现。我们可以提高效率吗?