簡體   English   中英

如何使用SQL執行JSON遞歸嵌套聚合

[英]How can I perform a JSON recursive nested aggregation using SQL

我有一些數據:

rank_ | data | parent_rank
--------------------------
1     | a    | NULL
2     | b    | 1
3     | c    | 2
4     | d    | 2
5     | e    | NULL
6     | f    | NULL
7     | g    | 6
8     | h    | 6

我想轉換為嵌套形式:

rank_ | nested
--------------------------------------------------------------------------------------
1     | {"D": "a", "C": [{"C": [{"C": [], "D": "c"}, {"C": [], "D": "d"}], "D": "b"}]}
5     | {"D": "e", "C": []}
6     | {"D": "f", "C": [{"C": [], "D": "g"}, {"C": [], "D": "h"}]}

其中“ C”是孩子,“ D”是數據。

到目前為止,我具有以下代碼,但是到目前為止,我無法使其嵌套到任意深度: https : //www.db-fiddle.com/f/g7RFZQRX5JrzaYPXs62BNe/0

假設我們有帶有數據的表o

create table o (rank_ int, data varchar(10), parent_rank int) ;
insert into o (VALUES 
        (1, 'a', NULL),
        (2, 'b', 1),
        (3, 'c', 2),
        (4, 'd', 2),
        (5, 'e', NULL),
        (6, 'f', NULL),
        (7, 'g', 6),
        (8, 'h', 6)
    );

然后,您可以編寫一個簡單的遞歸函數,例如:

CREATE FUNCTION C(r INT) RETURNS JSONB AS
  ' BEGIN
      return (             
            jsonb_build_object(
                ''D'', ( select 
                         o.data 
                         from o
                         where o.rank_=r), 
                ''C'', ( select 
                         coalesce(
                            array_to_json(array_agg( C(o.rank_)  
                                          ORDER BY o.rank_))::JSONB,
                            ''[]''::JSONB )
                         from o
                         where o.parent_rank=r)
               )
            );

    END
    '
  LANGUAGE plpgsql;

並調用該函數獲取根注釋:

SELECT o.rank_, c(o.rank_)
from o
where o.parent_rank is null

在數據庫小提琴上查看

1   {"C":[{"C":[{"C":[],"D":"c"},{"C":[],"D":"d"}],"D":"b"}],"D":"a"}
5   {"C":[],"D":"e"}
6   {"C":[{"C":[],"D":"g"},{"C":[],"D":"h"}],"D":"f"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM