SQL Server 2016 JSON_VALUE语法

时间:2016-09-17 06:37:23

标签: sql-server json sql-server-2016

我有一个以表格形式返回数据的API:

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

使用JSON_VALUE,如何引用两个角色指示符" VW"," GM"等? 我可以得到这个名字&国家/地区使用路径$.cars,但无法查看如何获取(未命名)字段。 API不是我的,所以我无法决定格式。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

很遗憾,我现在无法访问SQL Server 2016来自行验证。但是this可以帮到你。

  • ' $' - 在输入文本中引用整个JSON对象
  • ' $ property1' - 引用JSON对象中的property1
  • ' $ [4]' - 引用JSON数组中的第5个元素(索引从像JavaScript一样从0开始计算)
  • ' $ property1.property2.array1 [5] .property3.array2 [15] .property4' - 引用JSON对象中的复杂嵌套属性
  • ' $信息。 "名字"' - 引用"名字" info对象中的属性。如果key包含一些特殊字符,如空格,美元等,则应该用双引号括起来

答案 2 :(得分:0)

谢谢大家。 我已经认为我知道答案,除了我把它写成p1.key并在SSMS中出错,这让我偏离了正轨。直到我读到你的解决方案时才知道我必须把它写成p1。[key]因为 key 是一个保留字。相当愚蠢的称呼列'键'我认为,当第一个是MS SQL中的保留字而第二个是ISO SQL中的保留字时,它就是'值'生活和学习。