2017-07-19 13 views
0

テーブルの現在の構造には、型が整数でjsonという2つのカラムがあります。jsonデータ型を持つPostgresの再帰的クエリ

JSONは構造化されておらず、ネストレベルを持つことができます。各JSONドキュメントは、親または子であり、levelフィールドで示されます。 levelparentの場合は、parentノードまたはchildノードのいずれかを含めることができます。 levelchildの場合は、JSONのリーフノードです。

ノードのネスティングは、私は特定の条件をすべてchildノードを必要とするクエリを、書き込みしようとしているn

することができます。

私が取っていたアプローチは次のとおりです。

  1. は次に、これらのchildノード上の投影を行うすべての子ノード
  2. のrecursively.Basicallyフラットな構造のすべてのchildのノードを検索します。
  3. このためのサンプルテーブルがここで見つけることができ

SqlFiddleLink

上記で使用されるJSONがここで見つけることができます: Sample JSON Structure

私は子供のレベルな作品を書かれているクエリ1レベルにすぎませんが、レベルまでネストするためには機能しません。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では、2つの行が入力されています。 IDは111で、ネストとクエリーの1つのレベルがあります。 しかし、110のIDは構造体のネストされたレベルを持ち、子ノードを返すと予想されるところのparent要素を返します。

答えて

0

再帰が明示的にJSON列に再帰構造を作成し、列value->'controls'、に基づいている必要があります:

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)  
+0

これは、ネストされたレベルまで動作します。 ';これを見た後、私は実際 SELECT( が TからALL SELECT N + 1 UNIONを選択)などのN T個のLIMIT 100から ' WITH RECURSIVE T(n)を理解しました –

関連する問題