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 2017中使用json传参时解析遇到的多层解析问题