gpt4 book ai didi

SQL Server - 使用交叉应用或 openjson 或任何东西递归地进入嵌套的 JSON 数组

转载 作者:行者123 更新时间:2023-12-03 22:18:43 25 4
gpt4 key购买 nike

我一直在阅读尽可能多的同一问题的问题和答案,但我想我的问题需要更多创造性的方法。

所以我这里有一个 JSON 字符串:

declare @json nvarchar(max) =
'{
"propertyObjects": [{
"propertyID": 1
, "title": "foo"
, "class": ""
, "typeid": 150
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 2
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 3
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{
"propertyID": 4
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 5
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 6
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{
"propertyID": 7
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{
"propertyID": 8
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{}]
}]
}]
}]
}]
}'

乍一看很疯狂,但这样想:
有一个名为 的数组属性对象 其中包含父子结构中的多个对象。
在每一层中,只有一个对象可以是父对象。正如你所看到的,对象 3 里面有 child 。

我在这里想要的是在表中列出这些对象,同时我们为每个对象指定一个 parentID,因此对象 4 有一个 ID 为 3 的父对象,而对象 3 本身的父对象为 0,因为它基本上位于顶层。

到目前为止,我尝试了一些方法,例如 公用表表达式 进行递归调用,但我失败了:
;with cte 
as
(
-- anchor member definition
select p.propertyID
, 0 as parentID
, p.title
, p.typeid
, p.[value]
, p.children
from openjson(@json, '$.propertyObjects')
with (
propertyID int
, title nvarchar(100)
, typeid int
, [value] nvarchar(1000)
, children nvarchar(max) as JSON
) as p

UNION ALL

-- recursive member definition
select 0 as propertyID
, 0 as parentID
, '' as title
, 0 typeid
, '' as [value]
, '' as children
/** child should be bound to parent **/
)
select * from cte

这就是我失败的地方,我不知道如何让它通过 child 递归地找到对象。另外,我不知道如何指定每个 child 的 parentID!
propertyID    parentID    title    typeid    value    children
----------------------------------------------------------------------------
1 0 foo 150 bar [{}]
2 0 foo 128 bar [{}]
3 0 foo 128 bar [{ "propertyID" : 4 ...
0 0 0

我也尝试使用交叉应用:
select *
from
openjson(@json, '$.propertyObjects')
with (
propertyID int
, title nvarchar(100)
, typeid int
, [value] nvarchar(1000)
, children nvarchar(max) as JSON
) as p
cross apply
openjson(p.children)
with (
propertyID int
, title nvarchar(100)
, typeid int
, [value] nvarchar(1000)
, children nvarchar(max) as JSON
) as r

但不是机会,我不知道这些 child 会在 JSON 字符串中深入到什么程度。此外,交叉应用的结果将附加列而不是行,这会导致结果中出现一个巨大的表,在这种方法中,我什至不能考虑指定 parentID。

这完全是一个失败,关于如何让所有 child 排成一行的任何想法?

所需表
propertyID    parentID    title    typeid    value
--------------------------------------------------
1 0 foo 150 bar
2 0 foo 128 bar
3 0 foo 128 bar
4 3 foo 128 bar
5 3 foo 128 bar
6 3 foo 128 bar
7 6 foo 128 bar
8 7 foo 128 bar

最佳答案

你实际上非常接近 - 你只需要使用 CROSS APPLY 连同 OPENJSON :

with cte as (
select
p.propertyID,
0 as parentID,
p.title,
p.typeid,
p.[value],
p.children
from openjson(@json, '$.propertyObjects') with (
propertyID int,
title nvarchar(100),
typeid int,
[value] nvarchar(1000),
children nvarchar(max) as json
) as p

union all

select
p.propertyID,
c.propertyID,
p.title,
p.typeid,
p.[value],
p.children
from cte as c
cross apply openjson(c.children) with (
propertyID int,
title nvarchar(100),
typeid int,
[value] nvarchar(1000),
children nvarchar(max) as json
) as p
where
c.children <> '[{}]'
)
select
c.propertyID,
c.parentID,
c.title,
c.typeid,
c.value
from cte as c

sql fiddle demo

关于SQL Server - 使用交叉应用或 openjson 或任何东西递归地进入嵌套的 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com