Sql server SQL Server 2016 JSON_值语法

Sql server SQL Server 2016 JSON_值语法,sql-server,json,sql-server-2016,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_值,如何引用两个字符的指示符VW、GM等。? 我可以使用路径$.ca

我有一个API以如下形式返回数据:

  "cars" : {"VW":{"name":"Volkswagen","country":"Germany"}, 
            "GM":{"name":"General Motors","country":"USA"},
            "RR":{"name":"Rolls Royce","country":"UK"}
            }
使用JSON_值,如何引用两个字符的指示符VW、GM等。?
我可以使用路径$.cars获取名称和国家,但看不到如何获取未命名字段。API不是我的,因此我无法指定格式。

不幸的是,我现在没有访问SQL Server 2016的权限来自己验证它。但是我应该帮助你

“$”–在输入文本中引用整个JSON对象 “$.property1”-引用JSON对象中的property1 “$[4]”–JSON数组索引中的引用第5个元素从0开始计数,就像JavaScript中一样 “$.property1.property2.array1[5]。property3.array2[15]。property4”-引用JSON对象中的复杂嵌套属性 '$.info。名字'–引用信息对象中的名字属性。如果键包含一些特殊字符,如空格、美元等,则应该用双引号括起来
此查询将返回什么

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

这:

会给你你需要的价值

编辑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)
谢谢大家。
我已经认为我知道答案了,只是我把它写成了p1.key,在SSMS中出现了一个错误,这让我偏离了方向。直到我读了你们的解决方案,我才意识到我必须把它写成p1。[key],因为key是一个保留字。我认为,当第一列在MS SQL中是保留字,第二列在ISO SQL中是保留字时,调用“key”和“value”列是相当愚蠢的。活到老学到老。

这有助于回答这个问题吗?SEDE位于SQL Server 2016上,因此您可以在这里访问它@MartinSmith我相信OP希望获得密钥列表VM、GM、RR。@GSerg我也相信,但不知道如何做到这一点。刚才留下了一个可以分叉的演示查询。看起来这几乎是正确的。从openjsonjson中选择[key]_query@js,“$.cars”可以。@GSerg谢谢您的检查!我的电脑上没有安装SQL Server 2016,因此无法检查。但我记得OPENJSON应该从json变量返回解析数据,我也没有。Martin Smith在使用SQL Server 2016的stackexchange data fiddler中创建了一个已保存查询的链接。单击Fork并试一试。@GSerg为什么我以前没有用过这个东西?因为我不知道!再次感谢你!我看到了Martin的链接,但我认为这是指向另一个问题的链接
key key     value      
--- ------- ---------- 
VW  name    Volkswagen 
VW  country Germany    

(2 row(s) returned)