在 SQL 服务器查询中使用 OPENJSON
Using OPENJSON in SQL Server Query
我正在尝试从存储在 SQL 服务器数据库中的 JSON 数组中提取一些信息。我可以看到我需要使用 OPENJSON,并且我找到了很多关于如何使用它的示例,但问题在于所有示例都演示了将单个 JSON 数组声明为变量并使用OPENJSON 打开它(例如 )。我想知道如何将其实际构建到数据库查询中。
数据库示例结构table:
Table: HELP_INFO
UID
ID
JSON
1
45745
JSON varchar - example below
2
45745
JSON varchar - example below
3
82567
JSON varchar - example below
JSON
的示例结构
Example 1
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}
Example 2
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":12,
"details":[{"floatv":2.0,"name":"Donald"},{"floatv":0.4,"name":"Mickey"}]}}}
对于 table 中的每一行,我需要打开 JSON 中的“详细信息”列表并提取所有“名称”值。详细信息列表中的项目始终具有相同的键,但列表中的项目数量不同。
我将如何编写查询来执行此操作,从 HELP_INFO table 上的行获取源 JSON 值及其 ID?
期望的输出:
UID
NAMES
45745
Tom Dick Harry
45745
Donald Mickey
82567
Other names
谢谢
您需要使用适当的 path
调用 OPENJSON()
来访问嵌套的 $.source_info.help_info.details
JSON 数组和 STRING_AGG()
来聚合名称:
示例数据:
SELECT *
INTO Data
FROM (VALUES
(1, 45745, '{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}')
) v (UID, ID, JSON)
声明:
SELECT
ID,
NAMES = (
SELECT STRING_AGG(JSON_VALUE([value], '$.name'), ' ')
WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROM OPENJSON(JSON, '$.source_info.help_info.details')
)
FROM Data
我正在尝试从存储在 SQL 服务器数据库中的 JSON 数组中提取一些信息。我可以看到我需要使用 OPENJSON,并且我找到了很多关于如何使用它的示例,但问题在于所有示例都演示了将单个 JSON 数组声明为变量并使用OPENJSON 打开它(例如
数据库示例结构table:
Table: HELP_INFO
UID | ID | JSON |
---|---|---|
1 | 45745 | JSON varchar - example below |
2 | 45745 | JSON varchar - example below |
3 | 82567 | JSON varchar - example below |
JSON
的示例结构Example 1
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}
Example 2
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":12,
"details":[{"floatv":2.0,"name":"Donald"},{"floatv":0.4,"name":"Mickey"}]}}}
对于 table 中的每一行,我需要打开 JSON 中的“详细信息”列表并提取所有“名称”值。详细信息列表中的项目始终具有相同的键,但列表中的项目数量不同。
我将如何编写查询来执行此操作,从 HELP_INFO table 上的行获取源 JSON 值及其 ID?
期望的输出:
UID | NAMES |
---|---|
45745 | Tom Dick Harry |
45745 | Donald Mickey |
82567 | Other names |
谢谢
您需要使用适当的 path
调用 OPENJSON()
来访问嵌套的 $.source_info.help_info.details
JSON 数组和 STRING_AGG()
来聚合名称:
示例数据:
SELECT *
INTO Data
FROM (VALUES
(1, 45745, '{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}')
) v (UID, ID, JSON)
声明:
SELECT
ID,
NAMES = (
SELECT STRING_AGG(JSON_VALUE([value], '$.name'), ' ')
WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROM OPENJSON(JSON, '$.source_info.help_info.details')
)
FROM Data