You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用SQL Server OPENJSON将JSON数据转换为指定格式数据表

解决方法:拆分JSON数组实现questionId与answer一一对应

你的问题出在没有正确拆解answer这个嵌套数组——原来的SQL尝试直接提取整个数组,而不是把数组里的每个元素单独拆成行。下面是修正后的实现:

正确的SQL语句

DECLARE @responseJson NVARCHAR(MAX) = N'{ "Response": [ { "questionId": 1, "answer": [ "5","6" ] }, { "questionId": 2, "answer": [ "5" ] } ] }'

SELECT
    JSON_VALUE(r.value, N'$.questionId') AS QuestionId,
    a.value AS Answer
FROM OPENJSON(@responseJson, N'$.Response') r
CROSS APPLY OPENJSON(r.value, N'$.answer') a

代码解释

  • 第一步:OPENJSON(@responseJson, N'$.Response') r 先解析外层的Response数组,得到每个包含questionIdanswer数组的JSON对象。
  • 第二步:CROSS APPLY OPENJSON(r.value, N'$.answer') a 对每个外层对象里的answer数组做二次解析,把数组中的每个元素单独拆分成一行,a.value就是数组里的单个answer值。
  • 第三步:用JSON_VALUE(r.value, N'$.questionId')从外层对象中提取对应的questionId,和每个拆分后的answer值做关联。

执行结果

执行后会得到你期望的一一对应的数据表:

QuestionIdAnswer
15
16
25

如果你的answer数组里是复杂JSON对象(而非简单字符串),可以在第二个OPENJSON里用WITH子句来指定字段映射,比如:

CROSS APPLY OPENJSON(r.value, N'$.answer') WITH (
    AnswerValue NVARCHAR(100) '$.value'
) a

内容的提问来源于stack exchange,提问作者Raj

火山引擎 最新活动