Рекурсивный запрос к данным jsonb, хранящимся в Postgres - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть таблица в postgres с именем 'books' с одним столбцом jsonb под названием 'j' со следующими данными:

{
  "entity": "Book",
  "processes": [
    {  "process": [
        { "processname": "Buy",
          "option": "none",
            "processes": [
              { "process": [
                { "processname": "Order",
                  "option": "none"
                }
                ]
              },
               { "process": [
                { "processname": "Arrive",
                  "option": "none"
                }
                ]
              },
               { "process": [
                { "processname": "Enter",
                  "option": "none"
                }
                ]
              }

             ]
        }
     ]
    },
    { "process": [
        { "processname": "Use",
          "option": "none",
    "processes": [
      { "process": [
          { "processname": "Lend",
            "option": "*",
"processes": [
    {
      "process": [
        {
          "processname": "Borrow",
          "option": "none"
        }
      ]
    },
    {
      "process": [
        {
          "processname": "Return",
          "option": "none"
        }
      ]
    }
 ]
          }
       ]
       } 
      ]
         }
]
    },
    {  "process": [
        { "processname": "Scrap",
          "option": "none",
           "processes": [
              { "process": [
                { "processname": "Sold",
                  "option": "0"
                }
                ]
              },
               { "process": [
                { "processname": "Scrap",
                  "option": "0"
                }
                ]
              }
        ]
    }
  ]
}
]
}

Я хочу получить все имена процессов вместе с именами процессов их родителей (т. е. путем к ним) .

Пока у меня есть следующий код, но объединяющая часть не работает.

with recursive jsonrecursion as
(
      select process -> 'processname' as processname, '{}'::int[] as superior, 0 as lv
        from books, jsonb_array_elements(j-> 'processes') processes, jsonb_array_elements(processes-> 'process') process
       where process -> 'processes' is NULL

         union all

      select process -> 'processname' as processname, superior ||  process -> 'processname', lv+1
        from    books, jsonrecursion
       where not process -> 'processname' = any(superior)
)

SELECT processname, superior, lv
FROM jsonrecursion;

Может ли кто-нибудь помочь, пожалуйста? Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...