2017-12-28 25 views
0

JSONデータを保持する列を含むSQLテーブルがあります。値のJSON配列から特定のJSON配列を取得する

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' 

クエリは、書かれた通り、返します。

{ 
    "_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": "[email protected]", 
    "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" 
    } 

私は次のように最初と最後の名前とすべての友達を取得するクエリを実行できます。次のようにJSON値の一つが見えますこのようになります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の知識は限られています。

+0

、「$ .friends:

は、まず、そのことができますSTUFFそのようなFriendsListフィールドにそれらの名前を、名前だけを返すサブクエリを作成します。名前 ') '? – DavidG

+0

@DavidG - 私はそれを試みた。 NULLを返します。 –

+0

これで十分でしょうか? '[名前] NVARCHAR(25) '$ .name')' – DavidG

答えて

3

期待どおりの形式で配列を作成するのは面白いです。デフォルトでは、常にkey:valueのペアとしてJSON配列が作成されます。これを回避するには、JSONを使用するときにSTUFF()FOR XMLを使用します。

あなたがJSON_QUERY(JsonValue `やるとどう
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> 
+1

または潜在 'FriendsList = '[' +((STRING_AGGをSELECT ' "' + [名] + '"'、 '、') \t \t \t \t \t(JsonValue、 '$。友人') (WITH [名前] NVARCHAR(100) '$ .name')) + ']' 'OPのバージョンによって異なります –

関連する問題