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
我想知道是否可以从 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