【问题标题】:Parse JSON Array of arrays to SQL table将 JSON 数组解析为 SQL 表
【发布时间】:2020-10-16 13:12:15
【问题描述】:

我有一个来自 API 的 JSON 响应,如下所示:

{
  "series":[
   {
    "series_id": "SER_ID_1",
    "data": [
          ["20200101",
           1.0
          ],
          ["20200102",
           1.9
          ],
          ["20200103",
           4.5
          ]
        ]
  },
  {
    "series_id": "SER_ID_2",
    "data": [
          ["20200101",
           6.0
          ],
          ["20200102",
           8.9
          ],
          ["20200103",
           1.5
          ]
        ]
  }
 ]
}

N series 中可以有 N 值,data 中也可以有 N 值。

我想在 SQL 中解析这个 JSON,以便得到以下结果:

series_id       date        value
SER_ID_1        20200101.   1.0
SER_ID_1        20200102.   1.9
SER_ID_1        20200103.   4.5
SER_ID_2        20200101.   6.0
SER_ID_2        20200102.   8.9
SER_ID_2        20200103.   1.5

请提供 SQL 服务器查询以获得解析 JSON 所需的结果。

提前致谢。

【问题讨论】:

  • 我知道,我使用了一个不正确的词,例如“提供”,并且没有提及我尝试了什么。我曾尝试使用 OPENJSON CROSS APPLY,但没有奏效。我总是自己先尝试,只是没有正确表达问题。

标签: sql arrays json sql-server


【解决方案1】:

您需要使用 OPENJSON() 使用适当的显式架构两次解析输入 JSON。当然,您需要 SQL Server 2016+ 才能使用内置的 JSON 支持。

JSON:

DECLARE @json nvarchar(max) = N'
{
  "series":[
    {
    "series_id": "SER_ID_1",
    "data": [["20200101", 1.0], ["20200102", 1.9], ["20200103", 4.5]]
    },
    {
    "series_id": "SER_ID_2",
    "data": [["20200101", 6.0], ["20200102", 8.9], ["20200103", 1.5]]
    }
  ]
}'

声明:

SELECT j1.series_id, j2.[date], j2.[value]
FROM OPENJSON(@json, '$.series') WITH (
   series_id varchar(10) '$.series_id',
   data nvarchar(max) '$.data' AS JSON
) j1
OUTER APPLY OPENJSON(j1.data) WITH (
   [date] date '$[0]',
   [value] numeric(5, 1) '$[1]'
) j2

结果:

series_id   date       value
SER_ID_1    2020-01-01   1.0
SER_ID_1    2020-01-02   1.9
SER_ID_1    2020-01-03   4.5
SER_ID_2    2020-01-01   6.0
SER_ID_2    2020-01-02   8.9
SER_ID_2    2020-01-03   1.5

【讨论】:

  • 非常感谢@zhorov。我尝试了相同的交叉应用并使用了三次。再次感谢,帮助很大。
猜你喜欢
  • 2017-11-26
  • 1970-01-01
  • 2022-01-22
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2012-05-09
  • 2021-12-28
相关资源
最近更新 更多