SQL Server中的OpenJson用于嵌套的json数据?

Posted

技术标签:

【中文标题】SQL Server中的OpenJson用于嵌套的json数据?【英文标题】:OpenJson in SQL Server for nested json data? 【发布时间】:2018-11-14 16:26:10 【问题描述】:

我有一个这样的 json 数据:

[
    "id": 1, "id": 3, "id": 2, "children": ["id": 4, "id": 5] 
]

请帮助我如何将这些数据解析为关系数据:

Column: Id     Order/Index    ParentId
---------------------------------------
        1      1              0   
        3      2              0
        2      3              0
        4      4              2
        5      5              2  

【问题讨论】:

这信息不够... 仅在第一层有一个对象children 还是可能还有更多更深的嵌套children?换句话说:id=5 可以拥有children 本身吗? 是的,在这个示例中,只有儿童的第一级,你是对的,在我的项目中有更多的级别和嵌套数据 【参考方案1】:

这个请求中有一些重要的事情。首先是按文档位置对结果行进行排序,当您使用 OPENJSON ... WITH 投影列时,这是不可见的。第二个是您需要一个分层查询(假设可能有多个级别)。

总之,是这样的:

declare @doc nvarchar(max) = N'["id":1,"id":3,"id":2,"children":["id":4,"id":5]]';

with q as
(
    select [key] nodePath, 
           cast(json_value(d.[value],'$.id') as int) Id,
           cast(null as int) ParentId,
           cast(json_query(d.[value],'$.children') as nvarchar(max)) children
    from openjson(@doc) d
    union all
    select q.nodePath + '.' + d.[key] nodePath, 
           cast(json_value(d.[value],'$.id') as int) Id,
           q.id ParentId, 
           cast(json_query(d.[value],'$.children') as nvarchar(max)) children
    from q
    outer apply openjson(q.children) d
    where q.children is not null
)
select Id, row_number() over (order by nodePath) [Order/Index], ParentId
from q
order by [Order/Index]

输出

Id          Order/Index          ParentId
----------- -------------------- -----------
1           1                    NULL
3           2                    NULL
2           3                    NULL
4           4                    2
5           5                    2

(5 rows affected)

【讨论】:

太棒了,感谢您的支持!

以上是关于SQL Server中的OpenJson用于嵌套的json数据?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?

无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组

具有深度嵌套数组循环的 SQL 查询 OpenJson

如何从 SQL Server 中的动态节点加载 OPENJSON

如何反转 SQL Server 中的 OPENJSON() 函数?

SQL Server 2016 存储过程中的串联 OPENJSON