问题描述
我想知道是否可以从JSON结构下面选择数据?
[
{
"A": 6,"Status": 1
},{
"A": 3,"Status": 0
},{
"A": 6,{
"A": 7,"Status": 0
}
]
"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