在单个SQL查询中返回json层次结构

Ada*_*zek 4 sql postgresql recursion hierarchical-data

我需要创建一个返回分层json结果的SQL查询(postgres 9.5.3).这是我到目前为止编写的代码

WITH RECURSIVE q AS ( 
    WITH c AS (
        SELECT pc."Id", pc."Description"
        FROM "ProductCategories" pc 
        WHERE pc."Active" = true 
    )
    SELECT pc, ARRAY[c] as "Children", ARRAY[pc."Id"] as "Path" 
    FROM "ProductCategories" pc 
    LEFT JOIN c ON pc."Id" = c."Id"
    WHERE NULLIF(pc."ParentId", 0) IS NULL 
    AND pc."Active" = true 
    UNION ALL 
    SELECT pc_descendant, array_append(q."Children", c), q."Path" || pc_descendant."Id" 
    FROM q 
    JOIN "ProductCategories" pc_descendant ON pc_descendant."ParentId" = (q.pc)."Id" 
    LEFT JOIN c ON pc_descendant."Id" = c."Id"
    WHERE pc_descendant."Active" = true 
)
SELECT * FROM q
Run Code Online (Sandbox Code Playgroud)

我有创建分层对象的问题Children.对于这些结构

A
    B
        C
D
    E
Run Code Online (Sandbox Code Playgroud)

array_append功能似乎任何附加子元素为单个数组:

A.Children = [ {B}, {C}, {D} ]    //for category A
Run Code Online (Sandbox Code Playgroud)

我需要结构:

  A.Children = [ {B, Children = [ {C, Children = [ {D} ] } ] } ]
Run Code Online (Sandbox Code Playgroud)

如何更改查询以实现此目的?问候

Abe*_*sto 6

不确定是否有可能至少以简单方便的方式.

然而,使用"真实"递归似乎很简单.

这是一个简单的例子:

create temp table t(id int, parent int, name text) on commit drop;

insert into t values
  (1,null,'john'),
  (2,1,'jane'),
  (3,1,'jack'),
  (4,2,'julian');

create or replace function build_family(p_parent int) returns setof jsonb as $$

  select
    case 
      when count(x) > 0 then jsonb_build_object('name', t.name, 'family', jsonb_agg(f.x))
      else jsonb_build_object('name', t.name)
    end
  from t left join build_family(t.id) as f(x) on true
  where t.parent = p_parent or (p_parent is null and t.parent is null)
  group by t.id, t.name;

$$ language sql;


select jsonb_pretty(build_family) from build_family(null::int);
Run Code Online (Sandbox Code Playgroud)

结果是

????????????????????????????????????????
?             jsonb_pretty             ?
????????????????????????????????????????
? {                                   ??
?     "name": "john",                 ??
?     "family": [                     ??
?         {                           ??
?             "name": "jane",         ??
?             "family": [             ??
?                 {                   ??
?                     "name": "julian"??
?                 }                   ??
?             ]                       ??
?         },                          ??
?         {                           ??
?             "name": "jack"          ??
?         }                           ??
?     ]                               ??
? }                                    ?
????????????????????????????????????????

我希望您可以根据您的数据进行调整.

祝好运.