测试嵌套 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 APPLYOPENJSON()。第一个 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'