在 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