OpenJson в SQL Server для вложенных данных JSON? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть данные в формате 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  

1 Ответ

0 голосов
/ 14 ноября 2018

В этом запросе есть несколько нетривиальных вещей.Во-первых, это упорядочить результирующие строки по позиции документа, которая не видна, когда вы используете 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)
...