从JSON数组值中检索特定的JSON数组

时间:2017-12-28 16:20:11

标签: json sql-server sql-server-json

我有一个SQL表,其中包含一个包含JSON数据的列。其中一个JSON值如下所示:

{
    "_id": "5a450f038104ca3cb0ff74b5",
    "index": 3,
    "guid": "20d807c5-bddc-44b9-97fe-fd18af1b6066",
    "isActive": false,
    "balance": "$2,832.38",
    "picture": "http://placehold.it/32x32",
    "age": 23,
    "eyeColor": "brown",
    "firstname": "Genevieve",
    "lastname": "Green",
    "gender": "female",
    "company": "PROFLEX",
    "email": "genevievegreen@proflex.com",
    "phone": "+1 (919) 464-2866",
    "address": "107 Clermont Avenue, Rew, California, 4298",
    "about": "Magna pariatur ut enim nulla pariatur ad Lorem amet. Proident nulla exercitation id Lorem commodo minim cillum irure exercitation labore nostrud nostrud sint. Voluptate commodo ea commodo quis Lorem laborum culpa voluptate enim nulla enim duis.\r\n",
    "registered": "2016-02-16T09:51:25 +05:00",
    "latitude": -16.492643,
    "longitude": -71.782118,
    "tags": [
      "in",
      "non",
      "eiusmod",
      "labore",
      "dolor",
      "laboris",
      "ullamco"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Mccoy Berg",
        "interests": [
          "Music",
          "Birding",
          "Chess"
        ]
      },
      {
        "id": 1,
        "name": "Chase Mcfadden",
        "interests": [
          "Software",
          "Chess",
          "History"
        ]
      },
      {
        "id": 2,
        "name": "Michele Dodson",
        "interests": [
          "Football",
          "Birding",
          "Movies"
        ]
      }
    ],
    "greeting": "Hello, Genevieve! You have 2 unread messages.",
    "favoriteFruit": "strawberry"
  }

我可以执行一个查询,检索名字和姓氏以及所有朋友,如下所示:

SELECT
  JSON_VALUE(JsonValue, '$.firstname') as FirstName,
  JSON_VALUE(JsonValue, '$.lastname') as LastName,
  JSON_QUERY(JsonValue, '$.friends') as FriendsList,
From <MyTable>
Where JSON_VALUE(JsonValue,'$.lastname') = 'Green'

如上所述,查询返回FriendsList的JSON字符串,如下所示:

[  
   {  
      "id":0,
      "name":"Mccoy Berg",
      "interests":[  
         "Music",
         "Birding",
         "Chess"
      ]
   },
   {  
      "id":1,
      "name":"Chase Mcfadden",
      "interests":[  
         "Software",
         "Chess",
         "History"
      ]
   },
   {  
      "id":2,
      "name":"Michele Dodson",
      "interests":[  
         "Football",
         "Birding",
         "Movies"
      ]
   }
]

我真正想要的只是一系列朋友名字,如下所示:

["Mccoy Berg", "Chase Mcfadden", ...]

我确信这是可能的,但我对JSON的了解有限。

1 个答案:

答案 0 :(得分:3)

在以您期望的格式创建数组时,SQL服务器很有趣。默认情况下,它始终将JSON数组创建为键:值对。在使用JSON时,您可以使用STUFF()FOR XML解决此问题。

您首先创建一个仅返回名称的子查询,然后您可以STUFF将这些名称FriendsList添加到SELECT FirstName = JSON_VALUE(JsonValue, '$.firstname') ,LastName = JSON_VALUE(JsonValue, '$.lastname') ,FriendsList = '[' + STUFF( (SELECT ',' + '"' + [name] + '"' FROM OPENJSON(JsonValue,'$.friends') WITH ( [name] NVARCHAR(100) '$.name') FOR XML PATH ('')) , 1, 1, '') + ']' FROM <MyTable> 字段中,如下所示:

import com.microsoft.sqlserver.jdbc.SQLServerDriver;