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

时间:2018-09-17 23:34:05

标签: sql arrays json sql-server tsql

我正在尝试将json数组读入表,该数组中的节点(语言)之一本身就是一个数组,为此特定的列(语言)获得firewall-cmd

下面是示例json:

ipset

以下是我正在使用的查询:

null

以下是当前结果:

enter image description here

但是我需要如下结果

enter image description here

我在做什么错?请帮忙。

2 个答案:

答案 0 :(得分:1)

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

从Microsoft文档(所有详细信息均可在here中找到):

  

如果您未为列指定AS JSON,则该函数返回一个   的标量值(例如,int,string,true,false)   在指定路径上指定JSON属性。 如果路径代表   对象或数组,并且无法在   指定的路径,该函数在宽松模式下返回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

答案 1 :(得分:0)

我希望此查询对您有所帮助。结果与您想要的有点不同。

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