表的当前结构有两列,其类型为整数和json。
JSON是非结构化的,它可以具有任何嵌套级别。每个JSON文档可以是父项或子项,由level
字段指示。
如果level
为parent
,则它可以包含另一个parent
节点或child
节点。
如果level
是child
,那么它就是JSON的叶节点。
节点的嵌套可以是n
我正在尝试编写一个查询,我需要具有特定条件的所有child
节点。
我采取的方法是:
child
个节点。所有子节点的基本扁平结构child
节点进行投影。 此处的示例表可在此处找到: SqlFiddleLink
上面使用的JSON可以在这里找到: Sample JSON Structure
我写的查询在子级别仅为一级但在嵌套级别n
工作到1级的查询是:
WITH RECURSIVE x ( c ) AS (
Select * from
json_array_elements((select info FROM Controls where ID='111'))c
where c ->>'level' = 'child'
UNION ALL
select json_array_elements(
(
Select parent_control->'controls' controls from
json_array_elements((select info FROM Controls where
ID='111'))parent_control
where parent_control ->>'level' = 'parent'
))
)select c->>'unique_tag' as unique_tag, c ->>'values' as values from x
我可能会错过这里非常小的事情,我正在敲打我的脑袋直到任何嵌套级别。任何帮助表示赞赏。
在SqlFiddle中,我输入了两行。
具有111
的ID具有一级嵌套和查询。
但是,带有110
的ID具有嵌套的结构级别,它只返回父元素,我期望它返回子节点。
答案 0 :(得分:0)
递归应该基于列value->'controls'
,它在json列中显式创建一个递归结构:
with recursive rec_controls(id, unique_tag, controls, level) as (
select id, value->>'unique_tag', value->'controls', value->>'level'
from controls, json_array_elements(info)
union all
select id, value->>'unique_tag', value->'controls', value->>'level'
from rec_controls, json_array_elements(controls)
)
select id, unique_tag
from rec_controls
where level = 'child'
order by 1, 2;
id | unique_tag
-----+------------
110 | child_1
110 | child_2
110 | child_3
111 | 1
111 | 2
111 | 4
111 | 5
111 | 6
111 | 8
(9 rows)