1

私はこの値を持つテーブルに列を持っていmyColumnます:myTable

"6285":[
         {
           "75963":{"lookupId":"54","value":"0","version":null},
           "75742":{"lookupId":"254","value":"991","version":null}
         }
       ]

または関数selectを使用してクエリを記述する必要があります (私のバージョンは をサポートしていません)。クエリは次の結果を返す必要があります。JSON_VALUEJSON_QUERYsql serverOPENJSON

"75963-0, 75742-991"

ご覧のとおり、valueパラメーターの値が必要です。6285また、配列内のオブジェクトに含まれる要素がわからないことに注意してください。つまり、2 つの要素 (75963 と 75742) が含まれることを事前に知りません。多かれ少なかれ要素が存在する可能性があり、それらはもちろん異なる可能性があります. ただし6285、配列内のオブジェクトは常に 1 つだけです。

それを達成するためにどのようなものselectを書くことができますか?

4

1 に答える 1

2

奇妙なことに、あなたのバージョンはサポートしていると思いますOPENJSON()。次のステートメントを使用してみてください。質問の JSON は有効ではないことに注意してください{}

テーブル:

CREATE TABLE Data (JsonColumn varchar(1000))
INSERT INTO Data (JsonColumn) 
VALUES ('{"6285":[{"75963":{"lookupId":"54","value":"0","version":null},"75742":{"lookupId":"254","value":"991","version":null}}]}')

声明:

SELECT CONCAT(j2.[key], '-', JSON_VALUE(j2.[value], '$.value')) AS JsonValue
FROM Data d
CROSS APPLY OPENJSON(d.JsonColumn) j1
CROSS APPLY OPENJSON(j1.[value], '$[0]') j2

結果:

JsonValue
---------
75963-0
75742-991

集計結果が必要な場合は、次を使用できますSTRING_AGG()

SELECT STRING_AGG(CONCAT(j2.[key], '-', JSON_VALUE(j2.[value], '$.value')), ',') AS JsonValue
FROM Data d
CROSS APPLY OPENJSON(d.JsonColumn) j1
CROSS APPLY OPENJSON(j1.[value], '$[0]') j2

結果:

JsonValue
-----------------
75963-0,75742-991
于 2020-07-07T13:05:00.333 に答える