SQL Server:此JSON结构中的SELECT JSON列

问题描述

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

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

根据此link,在数组/对象之前有属性

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

例如,(从上面的链接获取示例),我们看到查询属性EmployeeInfo开始,从而使查询成为可能以获取查询中的数据。

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

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

解决方法

类似这样的东西

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

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

输出

A   Status
6   1
3   0
6   1
7   0
,

您有两个选择来解析此JSON数组:

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

JSON:

DECLARE @json varchar(max) = '
[
    {
        "A": 6,"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,'$[0].Status') AS Status

结果:

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