2017-11-27 6 views
0

JSONデータを含むnvarchar列のテーブルに複数の行があるとします。各行には、{ "key": "value" }のような単純なJSONオブジェクトがあります。任意の数のグループ、およびごとの行の数に制限はありませができSQL Serverの複数の行に格納されたJSONからJSONオブジェクトの配列を作成する最適な方法は何ですか?

{ 
    "data": [ 
     { "key": "value" }, 
     { "key": "value" }, 
     { "key": "value" } 
    ] 
} 

:のような、行のグループのために、配列として単一のJSONオブジェクトにこれらのオブジェクトのすべてを構成するための最良の方法は何ですかグループ。各オブジェクトは異なる可能性があります。

現在のところ、FOR XML PATHを使用して1つの文字列に連結する方法がありますが、これは奇妙なテキスト(たとえば)が入ってしまい、弾力性のあるアプローチにはなりません。 JSON_MODIFYを使用する可能性はありますが、グループごとに未知の行をどのように使用するのかはわかりません。

+0

XMLのPATH' FOR 'STRING_AGG'が利用可能になったとき、なぜ'? 'STRING_AGG([column]、 '、')'はそれ以上エスケープしないで正しく連結しなければなりません。彼らが言っているように、 'CONCAT( '{" data ":['、...、 ']}')'で囲み、あなたの叔父でなければなりません。 –

+0

私はこの質問に「sql-server-2017」と誤ってタグ付けしました。私たちの環境はまだ2016年なので、残念なことに 'STRING_AGG'を活用することはできません。 –

答えて

0

SQLでJSONデータの配列を作成することは、必ずしも簡単ではありません。一例として、次の表を参照してください:

CREATE TABLE #test (id INT, jsonCol NVARCHAR(MAX)) 

INSERT INTO #test 
    (
     id 
     ,jsonCol 
    ) 
VALUES 
    (
     1 
     ,N'{ "make": "ford" }' 
    ), 
    (
     1 
     ,N'{ "make": "mazda" }' 
    ) 
    , 
    (
     2 
     ,N'{ "color": "black" }' 
    ) 

あなたは、あなたの質問に掲載され、アレイと単一JSONオブジェクトを作成するために、次のクエリを使用することができます。

SELECT DISTINCT [data] = 
JSON_QUERY('[' + STUFF(
         (SELECT ',' + jsonCol FROM #test FOR XML PATH ('')) 
         , 1, 1, '') 
      + ']') 
FROM #test 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 

出力は次のようになります。 :

{ 
    "data":[ 
      { "make": "ford" }, 
      { "make": "mazda" }, 
      { "color": "black" } 
    ] 
} 

メインとサブクエリのID列を相互に関連付けて、idでグループ化されたjsonを取得することもできます。ここで は例です:

SELECT DISTINCT id 
     , [json] = (SELECT DISTINCT [data] = 
    JSON_QUERY('[' + STUFF(
          (SELECT ',' + jsonCol FROM #test t3 WHERE t3.id = t2.id FOR XML PATH ('')) 
          , 1, 1, '') 
       + ']') 
    FROM #test t2 
    WHERE t2.id = t1.id 
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) 
FROM #test t1 

出力は次のようになります。

id json 
1 {"data":[{ "make": "ford" },{ "make": "mazda" }]} 
2 {"data":[{ "color": "black" }]} 
関連する問題