2017-07-31 32 views
1

是否可以在Sql Server 2016中將來自多個數組元素的json文檔的某些部分合併到一個結果中?使用Sql Server 2016的OPENJSON函數從Json文檔中選擇多個數組元素的結果

鑑於此JSON:

{ 
    "fruit": { 
    "types": [ 
     { 
     "possible": [ "Apples", "Bananas", "Pears" ], 
     "category": "Basic" 
     }, 
     { 
     "possible": [ "Oranges", "Grapefruit", "Lemons", "Limes" ], 
     "category": "Citrus" 
     }, 
     { 
     "possible": [ "Blueberries", "Strawberries", "Cherries" ], 
     "category": "Berries" 
     } 
    ] 
    } 
} 

我想看到從可能的元素中的所有值的一個結果:

results 
----- 
Apples 
Bananas 
Pears 
Oranges 
Grapefruit 
Lemons 
Limes 
Blueberries 
Strawberries 
Cherries 

我已經得到接近這樣做:

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[0].possible')) 
UNION 
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[1].possible')) 
UNION 
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[2].possible')) 

但是這依賴於將查詢綁定到數組中的元素數量。 有沒有辦法做到這一點,而不必單獨指定每個數組元素?像這樣的事情(這些都不是有效的表達式):

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[].possible')) 

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types.possible')) 

這是我應該做一個CROSS APPLY?

回答

2

這是我應該做一個CROSS APPLY嗎?

是的。

declare @json nvarchar(max)=' 
{ 
    "fruit": { 
    "types": [ 
     { 
     "possible": [ "Apples", "Bananas", "Pears" ], 
     "category": "Basic" 
     }, 
     { 
     "possible": [ "Oranges", "Grapefruit", "Lemons", "Limes" ], 
     "category": "Citrus" 
     }, 
     { 
     "possible": [ "Blueberries", "Strawberries", "Cherries" ], 
     "category": "Berries" 
     } 
    ] 
    } 
} 
' 

select v.value 
from openjson(@json, '$.fruit.types') t 
cross apply openjson(t.value,'$.possible') v 

輸出

value 
--------- 
Apples 
Bananas 
Pears 
Oranges 
Grapefruit 
Lemons 
Limes 
Blueberries 
Strawberries 
Cherries 

(10 row(s) affected) 
+0

奇妙。謝謝。 –

相關問題