2017-07-07 13 views
1

[ID]と[Content]の2つの列を持つテーブルがあります(ISJSON制約のため、[Content]列に有効なJSONが必要です)。 これらのJSONには配列フィールドがあり、特定のID(およびより多くのフィールド)を持つオブジェクトで構成されています。SQL Server:json列に特定のIDを持つ行を選択します。

{ 
    "departments": [ { "id": 1, "fieldA": "somevalue" }, 
        { "id": 2, "fieldA": "somevalue" }] 
    } 

私は部署フィールドからオブジェクトにいくつかの特定のIDを持つすべての行を返す選択クエリを実行したいと思います。

SELECT * FROM OPENJSON(@content) WITH(id int) WHERE id IN (1, 2, 3, 9) 

しかし、それだけのDepartmentID返し、私は全体の行が必要になります。

は、私はその後@content変数に[内容]欄から部署フィールドをフェッチカーソルを使用してスクリプトを作成するために管理しました。 好ましくは、それはそれのようになります(ただし、以下のコードは、残念ながら動作しません):

SELECT * FROM ITEM I WHERE EXISTS 
(SELECT * FROM OPENJSON(I.CONTENT) WITH(id int) WHERE id IN (1, 2, 3, 9)) 

答えて

0

私が正しくあなたを理解している場合、これはあなたが必要なものを得ることができる:

declare @someId varchar(10) = '1' 
declare @json nvarchar(1000) = N'{ "departments": [ { "id": 1, "fieldA": "somevalue" }, { "id": 1, "fieldA": "test" }, { "id": 2, "fieldA": "somevalue" }] }' 

select ids.[key], ids.[value] id_val, depts.value content 
from openjson(@json, '$.departments') as depts cross apply OPENJSON(depts.value) as ids 
where ids.[key] = 'id' and ids.value = @someId 

私は別の要素を追加しました配列をdepartmentsに、結果をテストするために同じId = 1を使用してください。

EDIT:

select ids.[key], ids.[value] id_val, depts.value content 
from ITEMS i cross apply openjson(i.Content, '$.departments') as depts cross apply OPENJSON(depts.value) as ids 
where ids.[key] = 'id' and ids.value = @id 
+0

有望に見える、ありがとう!今、私はjsonデータを持つ多くの行を含むテーブルを持っています。この問題を解決するためにスニペットを使用するにはどうすればよいですか?私はRのような言語のベクトル化関数に慣れていましたが、私はそれを見て失望しました。 、depts.value content ids。[key] = 'departmentid'とids.value = item.valueのように、OPENJSON(depts.value) @ id' 'サブクエリが1つ以上の値を返しました 'というエラーを返します:( – duke

+0

あなたの選択はあなたの' ITEM'テーブルから 'Content'値をすべて取得しているので、これを適用する必要があります'Content'カラム 私は、あなたのソーステーブルでのクロス適用を考えています_OR_ダイナミッククエリを構築しています。最初のシナリオを試してみてください。 –

+0

テーブル内の1行だけがjsonのidを持つjsonを持っていると仮定できる場合、SELECT TOP 1を使用します。残念ながら、この仮定は間違っています。 – duke

関連する問題