使用postgres将所有节点的父子层次结构转换为json格式或任何其他格式

时间:2020-03-23 07:11:44

标签: sql json postgresql

表数据为

id  name    ob_name parent  level   type_id type_name
1   Objective 1 ob Objective 1 name [NULL]  0   1   Objective
11  Objective 3 Ob objective 3 name [NULL]  0   1   Objective
13  Objective 4 ob Objective 4  [NULL]  0   1   Objective
2   Key Result 1-1  Kr Key result 1-1   1   1   2   Keyresult
3   Kwyresult 1-2   Kr Key result 1-2 name  1   1   2   Keyresult
9   Key result 2    Kr Key result 2 name    [NULL]  1   2   Keyresult
12  Key Result 3    Kr Key result 3 name    11  1   2   Keyresult
4   Initiative 1-1-1    In Initiative 1-1-1 name    2   2   3   Initiative
5   Inititative 1-1-2   In Initiative 1-1-2 name    2   2   3   Initiative
6   Initiative 1-1-3    In Initiative 1-1-3 name    2   2   3   Initiative
7   Inititative 1-2-1   In Initiative 1-2-1 name    3   2   3   Initiative
8   Inititative 1-2-2   In Initiative 1-2-2 name    3   2   3   Initiative
10  Initiative 2    In Initiative 2 name    9   2   3   Initiative
14  Initiative 4    In Initiative 4 name    13  2   3   Initiative
15  Initiative Standalone   In initiative Standalone name   [NULL]  2   3   Initiative

我想要预期的输出json

{
  Objectives: [
    {
      id: 1,
      name: 'Objective 1',
      ob_name: 'ob Objective 1 name',
      parent: null,
      level: 0,
      type_id: 1,
      type_name: 'Objective',
      Keyresults: [
        {
          id: 2,
          name: 'Key Result 1-1',
          ob_name: 'Kr Key result 1-1',
          parent: 1,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: 4,
              name: 'Initiative 1-1-1',
              ob_name: 'In Initiative 1-1-1 name',
              parent: 2,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            },
            {
              id: 5,
              name: 'Inititative 1-1-2',
              ob_name: 'In Initiative 1-1-2 name',
              parent: 2,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            },
            {
              id: 6,
              name: 'Initiative 1-1-3',
              ob_name: 'In Initiative 1-1-3 name',
              parent: 2,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        },
        {
          id: 3,
          name: 'Kwyresult 1-2',
          ob_name: 'Kr Key result 1-2 name',
          parent: 1,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: 7,
              name: 'Inititative 1-2-1',
              ob_name: 'In Initiative 1-2-1 name',
              parent: 3,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            },
            {
              id: 8,
              name: 'Inititative 1-2-2',
              ob_name: 'In Initiative 1-2-2 name',
              parent: 3,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        }
      ]
    },
    {
      id: null,
      name: null,
      ob_name: null,
      parent: null,
      level: 0,
      type_id: 1,
      type_name: 'Objective',
      Keyresults: [
        {
          id: 9,
          name: 'Key result 2',
          ob_name: 'Kr Key result 2 name',
          parent: null,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: 10,
              name: 'Initiative 2',
              ob_name: 'In Initiative 2 name',
              parent: 9,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        }
      ]
    },
    {
      id: 11,
      name: 'Objective 3',
      ob_name: 'Ob objective 3 name',
      parent: null,
      level: 0,
      type_id: 1,
      type_name: 'Objective',
      Keyresults: [
        {
          id: 12,
          name: 'Key Result 3',
          ob_name: 'Kr Key result 3 name',
          parent: 11,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: null,
              name: null,
              ob_name: null,
              parent: 12,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        }
      ]
    },
    ,
    {
      id: 13,
      name: 'Objective 4',
      ob_name: 'Ob objective 4',
      parent: null,
      level: 0,
      type_id: 1,
      type_name: 'Objective',
      Keyresults: [
        {
          id: null,
          name: null,
          ob_name: null,
          parent: 13,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: 14,
              name: 'Initiative 4',
              ob_name: 'In Initiative 4 name',
              parent: 13,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        }
      ]
    },
    ,
    {
      id: null,
      name: null,
      ob_name: null,
      parent: null,
      level: 0,
      type_id: 1,
      type_name: 'Objective',
      Keyresults: [
        {
          id: null,
          name: null,
          ob_name: null,
          parent: null,
          level: 1,
          type_id: 2,
          type_name: 'Keyresult',
          Initiative: [
            {
              id: 15,
              name: 'Initiative Standalone',
              ob_name: 'In initiative Standalone name',
              parent: null,
              level: 2,
              type_id: 3,
              type_name: 'Initiative'
            }
          ]
        }
      ]
    }
  ]
}

我知道这是一个奇怪的要求。在我的应用程序中,没有中间件可以像这样操作。 预期的json用于绑定gridview。要求是“ type_id”是否为3类型。它在gridview中显示为3列,假设父子关系正确,则显示相同的喜怒无常,有时父关系缺失,则在层级结构中显示为空节点。

请告诉我,postgress中是否有类似此选项的选项或其他任何选项

0 个答案:

没有答案