У меня есть запрос приложения, который нужно переписать, чтобы можно было обновить БД. Я пробовал несколько вещей, перечисленных здесь на форумах, например, перемещение функций, возвращающих набор, в боковое соединение, но, похоже, не могу заставить его работать. любая помощь будет оценена. Оригинальный запрос ниже.

   SELECT id, name, description, owner, is_private, read_scopes, edit_scopes,
          CASE 
            WHEN jsonb_typeof(json_element) = 'array' 
            THEN jsonb_array_elements(json_element)
            WHEN jsonb_exists(json_element, 'children')
            THEN jsonb_array_elements(json_element -> 'children')
            END AS json_element
        FROM children
        WHERE  jsonb_typeof(json_element) = 'array' OR jsonb_typeof(json_element) = 'object'
0
DanVest14 12 Фев 2021 в 00:51

1 ответ

Лучший ответ

Вы можете переместить решение, какой массив разложить, в параметр, переданный в jsonb_array_elements ():

select id, name, j.*
from children c
  cross join jsonb_array_elements(case 
                                   when jsonb_typeof(c.json_element) = 'array' then json_element 
                                   when jsonb_typeof(c.json_element -> 'children') = 'array' then json_element -> 'children'
                                  end) as j(json_element)
where jsonb_typeof(c.json_element) = 'array'
   or jsonb_typeof(c.json_element -> 'children') = 'array'
0
a_horse_with_no_name 11 Фев 2021 в 22:11