テーブルの現在の構造には、型が整数でjsonという2つのカラムがあります。jsonデータ型を持つPostgresの再帰的クエリ
JSONは構造化されておらず、ネストレベルを持つことができます。各JSONドキュメントは、親または子であり、level
フィールドで示されます。 level
がparent
の場合は、parent
ノードまたはchild
ノードのいずれかを含めることができます。 level
がchild
の場合は、JSONのリーフノードです。
ノードのネスティングは、私は特定の条件をすべてchild
ノードを必要とするクエリを、書き込みしようとしているn
することができます。
私が取っていたアプローチは次のとおりです。
- は次に、これらの
child
ノード上の投影を行うすべての子ノード - のrecursively.Basicallyフラットな構造のすべての
child
のノードを検索します。 このためのサンプルテーブルがここで見つけることができ
上記で使用される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要素を返します。
これは、ネストされたレベルまで動作します。 ';これを見た後、私は実際 SELECT( が TからALL SELECT N + 1 UNIONを選択)などのN T個のLIMIT 100から ' WITH RECURSIVE T(n)を理解しました –