2016-09-17 153 views
3

我有一個API的形式返回數據:的SQL Server 2016 JSON_VALUE語法

"cars" : {"VW":{"name":"Volkswagen","country":"Germany"}, 
      "GM":{"name":"General Motors","country":"USA"}, 
      "RR":{"name":"Rolls Royce","country":"UK"} 
      } 

使用JSON_VALUE,我如何引用這兩個字符標誌 「VW」, 「GM」,等等? 我可以通過使用路徑$.cars獲得名稱& country,但無法看到如何獲取(未命名)字段。該API不是我的,所以我不能指定格式。

回答

0

不幸的是,我現在沒有權限訪問SQL Server 2016來驗證它。但this應該可以幫到你。

  • '$' - 在JSON數組引用5個元素 - 在引用JSON對象property1
  • '$ [4]' - 在輸入文本
  • '$ .property1' 的引用整個JSON對象(索引0在JavaScript計數等)
  • '$ .property1.property2.array1 [5] .property3.array2 [15] .property4' - 引用複雜的嵌套的JSON對象屬性
  • 「$。信息。 「名字」' - 在信息對象中引用「名字」屬性。如果密鑰包含一些特殊字符,如空格,美元等,則應該用雙引號括起來
+1

這有助於回答問題? – GSerg

+1

SEDE在SQL Server 2016上,所以你可以在這裏訪問它https://data.stackexchange.com/stackoverflow/query/540682 –

+0

@MartinSmith我相信OP想要得到鍵列表(「VM」,「GM」 ,「RR」)。 – GSerg

1

此查詢返回什麼?

set @json = N' 
["cars" : { 
    "VW":{ 
     "name":"Volkswagen", 
     "country":"Germany"}, 
    "GM":{ 
     "name":"General Motors", 
     "country":"USA"}, 
    "RR":{ 
     "name":"Rolls Royce", 
     "country":"UK"} 
}]'; 

select * 
from OPENJSON(@json) 

請您分享一下輸出嗎?

我很抱歉給出這個答案,但對於評論太長,而且這個查詢可能有助於找到OP想要獲取的元素。

編輯#1

此:

Declare @js nvarchar(4000) = N'{"cars" : { 
      "VW":{"name":"Volkswagen","country":"Germany"}, 
      "GM":{"name":"General Motors","country":"USA"}, 
      "RR":{"name":"Rolls Royce","country":"UK"}}}' 

SELECT [key] 
FROM OPENJSON (@js,'$.cars') 

會給你重視你的需要。

編輯#2

而且你可以在這個值參考:

SELECT p1.[key], 
     p2.[key], 
     p2.[value] 
FROM OPENJSON (@js, '$.cars') as p1 
CROSS APPLY (
    SELECT * 
    FROM OPENJSON ([value], '$') 
) p2 
WHERE p1.[key] = 'VW' 

輸出:

key key  value  
--- ------- ---------- 
VW name Volkswagen 
VW country Germany  

(2 row(s) returned) 
+0

這似乎是正確的。 '從openjson中選擇[key](json_query(@js,'$ .cars'))'這樣做。 – GSerg

+0

@Gserg感謝您的檢查!我沒有在我的電腦上安裝SQL Server 2016,因此無法檢查。但我記得'OPENJSON'應該從json變量返回分析數據。 – gofr1

+0

我也沒有。馬丁史密斯[張貼](http://stackoverflow.com/questions/39543633/sql-server-2016-json-value-syntax/39548190?noredirect=1#comment66405464_39545533)一個鏈接到保存在stackexchange數據提琴手的查詢使用SQL Server 2016.點擊叉子,然後離開。 – GSerg

0

謝謝大家。 我已經認爲我知道答案,只是我把它寫成p1.key,並在SSMS中出錯,這使我偏離了課程。直到我讀到你的解決方案後,我才意識到我必須把它寫成p1 [關鍵]因爲是一個保留字。我認爲,當第一個是MS SQL中的保留字時,第二個是ISO SQL中的保留字時,我認爲調用列的'key'和'value'非常愚蠢。活到老,學到老。