SQL 服务器:SELECT JSON 此 JSON 结构中的列

SQL Server : SELECT JSON Column in this JSON Structure

我想知道是否可以从 JSON 结构下方 select 数据?

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

根据这个link,在array/object之前有属性。

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

例如,(从上面 link 获取示例),我们看到查询以 属性 EmployeeInfo 开头,因此查询可以在此查询中获取数据。

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

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

像这样

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

你有两个选项来解析这个 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