使用json数据类型

时间:2017-07-19 15:01:31

标签: json database postgresql recursive-query postgresql-9.6

表的当前结构有两列,其类型为整数和json。

JSON是非结构化的,它可以具有任何嵌套级别。每个JSON文档可以是父项或子项,由level字段指示。 如果levelparent,则它可以包含另一个parent节点或child节点。 如果levelchild,那么它就是JSON的叶节点。

节点的嵌套可以是n

我正在尝试编写一个查询,我需要具有特定条件的所有child节点。

我采取的方法是:

  1. 递归查找所有child个节点。所有子节点的基本扁平结构
  2. 然后对这些child节点进行投影。
  3. 此处的示例表可在此处找到: 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具有嵌套的结构级别,它只返回父元素,我期望它返回子节点。

1 个答案:

答案 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)