测试嵌套 JSON 数组中是否存在某个值
Testing to see if a value exists in a nested JSON array
我有一个 SQL 2016 table,其中包含一个包含 JSON 数据的列。示例 JSON 文档如下所示:
{
"_id": "5a450f0383cac0d725cd6735",
"firstname": "Nanette",
"lastname": "Mccormick",
"registered": "2016-07-10T01:50:10 +04:00",
"friends": [
{
"id": 0,
"name": "Cote Collins",
"interests": [
"Movies",
"Movies",
"Cars"
]
},
{
"id": 1,
"name": "Ratliff Ellison",
"interests": [
"Birding",
"Birding",
"Chess"
]
},
{
"id": 2,
"name": "William Ratliff",
"interests": [
"Music",
"Chess",
"Software"
]
}
],
"greeting": "Hello, Nanette! You have 4 unread messages.",
"favoriteFruit": "apple"
}
我想提取每个 friends
对象的 interests
数组包含特定值的所有文档。我试过了,但没有结果:
Select *
From <MyTable>
Where 'Chess' IN (Select value From OPENJSON(JsonValue, '$.friends.interests'))
我应该返回几行。我一定没有正确引用兴趣数组,或者不理解 SQL 服务器如何处理这种类型的 JSON 数组。
由于 Interests
是一个嵌套数组,您需要通过数组级别来解析您的方式。为此,您可以使用 CROSS APPLY
和 OPENJSON()
。第一个 CROSS APPLY
将为您获取朋友姓名和 JSON 兴趣数组,然后第二个 CROSS APPLY
从数组中提取兴趣并将它们与适当的朋友名称关联起来。这是一个示例查询:
Select [name]
From #MyTable
CROSS APPLY OPENJSON(JsonValue, '$.friends')
WITH ([name] NVARCHAR(100) '$.name',
interests NVARCHAR(MAX) AS JSON)
CROSS APPLY OPENJSON(interests)
WITH (Interest NVARCHAR(100) '$')
WHERE Interest = 'Chess'
我有一个 SQL 2016 table,其中包含一个包含 JSON 数据的列。示例 JSON 文档如下所示:
{
"_id": "5a450f0383cac0d725cd6735",
"firstname": "Nanette",
"lastname": "Mccormick",
"registered": "2016-07-10T01:50:10 +04:00",
"friends": [
{
"id": 0,
"name": "Cote Collins",
"interests": [
"Movies",
"Movies",
"Cars"
]
},
{
"id": 1,
"name": "Ratliff Ellison",
"interests": [
"Birding",
"Birding",
"Chess"
]
},
{
"id": 2,
"name": "William Ratliff",
"interests": [
"Music",
"Chess",
"Software"
]
}
],
"greeting": "Hello, Nanette! You have 4 unread messages.",
"favoriteFruit": "apple"
}
我想提取每个 friends
对象的 interests
数组包含特定值的所有文档。我试过了,但没有结果:
Select *
From <MyTable>
Where 'Chess' IN (Select value From OPENJSON(JsonValue, '$.friends.interests'))
我应该返回几行。我一定没有正确引用兴趣数组,或者不理解 SQL 服务器如何处理这种类型的 JSON 数组。
由于 Interests
是一个嵌套数组,您需要通过数组级别来解析您的方式。为此,您可以使用 CROSS APPLY
和 OPENJSON()
。第一个 CROSS APPLY
将为您获取朋友姓名和 JSON 兴趣数组,然后第二个 CROSS APPLY
从数组中提取兴趣并将它们与适当的朋友名称关联起来。这是一个示例查询:
Select [name]
From #MyTable
CROSS APPLY OPENJSON(JsonValue, '$.friends')
WITH ([name] NVARCHAR(100) '$.name',
interests NVARCHAR(MAX) AS JSON)
CROSS APPLY OPENJSON(interests)
WITH (Interest NVARCHAR(100) '$')
WHERE Interest = 'Chess'