0

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

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

根据此链接,数组/对象之前有属性。

"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')

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

4

2 回答 2

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
于 2020-09-14T17:40:22.777 回答
1

像这样的东西

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
于 2020-09-14T17:24:37.960 回答