2016-09-17 208 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'非常愚蠢。活到老,学到老。