将JSON数组作为SQL表列之一读取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将JSON数组作为SQL表列之一读取相关的知识,希望对你有一定的参考价值。

我正在尝试将json数组读入表中,数组中的一个节点(语言)本身就是一个数组,我正在为这个特定的列(语言)获取null

以下是json示例:

DECLARE @json NVARCHAR(MAX) = '[
  {
     "Id":1,
     "Name":"Test1",
     "Languages":["L1", "L2"]
  },
  {
     "Id":2,
     "Name":"Test2",
     "Languages":["L3", "L4"]
  },
  {
     "Id":3,
     "Name":"Test2",
     "Languages":["L5", "L6"]
  }]'

以下是我使用的查询:

SELECT Id
     , Name 
     , Languages
  FROM OPENJSON(@json)
  WITH (Id INT '$.Id'
     , Name VARCHAR(20) '$.Name'
     , Languages VARCHAR(200) '$.Languages')

以下是当前结果:

enter image description here

但是我需要如下结果

enter image description here

我究竟做错了什么?请帮忙。

答案

您可以在NVARCHAR(max) as json子句中使用WITH作为语言项。

来自Microsoft docs(所有细节都可以找到here):

如果未为列指定AS JSON,则该函数将从指定路径上的指定JSON属性返回标量值(例如,int,string,true,false)。如果路径表示对象或数组,并且在指定路径中找不到该属性,则该函数在松弛模式下返回null或在严格模式下返回错误。此行为类似于JSON_VALUE函数的行为。

所以你的查询应该是这样的:

SELECT Id
     , Name 
     , Languages
  FROM OPENJSON(@json)
  WITH (Id INT '$.Id'
     , Name VARCHAR(20) '$.Name'
     , Languages NVARCHAR(max) as json)

结果:

enter image description here

另一答案

我希望这个查询可能对你有帮助。结果与您想要的有点不同。

DECLARE @json NVARCHAR(MAX) = '{"UserLang":[
  {
     "Id":1,
     "Name":"Test1",
     "Languages":["L1", "L2"]
  },
  {
     "Id":2,
     "Name":"Test2",
     "Languages":["L3", "L4"]
  },
  {
     "Id":3,
     "Name":"Test2",
     "Languages":["L5", "L6"]
  }]}'

SELECT 
JSON_VALUE(d.value,'$.Id') AS Id,
JSON_VALUE(d.value,'$.Name') AS Languages,
l.value AS Name
  FROM OPENJSON(@json,'$.UserLang') AS d CROSS APPLY OPENJSON (d.value,'$.Languages') AS l

以上是关于将JSON数组作为SQL表列之一读取的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:将数据帧作为 JSON 存储在 MySQL 表列中

SQL 表列到数组

如何在表列中访问 SQL 中的 varray 元素

将单个xml节点作为数组转换为json

在一对多映射中使用休眠条件(以行表列作为搜索条件之一的搜索标题表)

Json读取并转换为数据框