我正在尝试将json数组读入表,该数组中的节点(语言)之一本身就是一个数组,为此特定的列(语言)获得firewall-cmd
。
下面是示例json:
ipset
以下是我正在使用的查询:
null
以下是当前结果:
但是我需要如下结果
我在做什么错?请帮忙。
答案 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)
结果:
答案 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