SQL Server:在此 JSON 结构中选择 JSON 列

Posted

技术标签:

【中文标题】SQL Server:在此 JSON 结构中选择 JSON 列【英文标题】:SQL Server : SELECT JSON Column in this JSON Structure 【发布时间】:2020-09-14 17:14:35 【问题描述】:

我想知道是否可以从以下 JSON 结构中选择数据?

 [
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 3, 
        "Status": 0
    ,
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 7, 
        "Status": 0
    
]

根据这个link,数组/对象之前有Property。

"EmployeeInfo":   
        "FirstName":"Jignesh",  
        "LastName":"Trivedi",  
        "Code":"CCEEDD",  
        "Addresses": [  
             "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat",  
             "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"  
        ]  
     

例如,(从上面的链接获取示例),我们看到查询以属性EmployeeInfo 开始,这样查询就可以在此查询中获取数据。

SELECT JSON_VALUE(@JSONData, '$.EmployeeInfo.FirstName')

所以我只是无法弄清楚如何从上面提供的结构中实现这一点,任何人都可以向我指出一些有用的示例代码。谢谢。

【问题讨论】:

【参考方案1】:

您有两个选项来解析这个 JSON 数组:

OPENJSON() 与显式架构一起使用一次 - 以获取每个项目的内容 使用OPENJSON() 两次 - 获取每个项目的索引和内容

JSON:

DECLARE @json varchar(max) = '
[
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 3, 
        "Status": 0
    ,
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 7, 
        "Status": 0
    
]'

OPENJSON() 与显式架构一起使用一次:

SELECT A, Status
FROM OPENJSON(@json) WITH (
   A int,
   Status int
)

结果:

A   Status
6   1
3   0
6   1
7   0

使用OPENJSON() 两次:

SELECT 
   j1.[key] AS Index,
   j2.A, j2.Status
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON(j1.[value]) WITH (
   A int,
   Status int
) j2 

结果:

Index   A   Status
0       6   1
1       3   0
2       6   1
3       7   0

当然,您总是可以通过索引访问数组项:

SELECT 
   JSON_QUERY(@json, '$[0]') AS Item,
   JSON_VALUE(@json, '$[0].A') AS A, 
   JSON_VALUE(@json, '$[0].Status') AS Status

结果:

Item                   A    Status
"A": 6, "Status": 1  6    1

【讨论】:

【参考方案2】:

类似的东西

declare @json nvarchar(max) =N'
[
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 3, 
        "Status": 0
    ,
    
        "A": 6, 
        "Status": 1
    ,
    
        "A": 7, 
        "Status": 0
    
]'

select * from openjson(@json) with (A       int,
                                    Status  int);

输出

A   Status
6   1
3   0
6   1
7   0

【讨论】:

以上是关于SQL Server:在此 JSON 结构中选择 JSON 列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果

SQL Server JSON 数组

关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

SQL Server OPENJSON 读取嵌套的 json

SQL Server 中层次结构和规范化的建议

将嵌套的名称-值对从 json 导入 SQL Server