Свести вложенный массив jsonb в postgresql - PullRequest
0 голосов
/ 28 июня 2018

У меня есть данные в таблице как

id(integer)    | label(text)     | value(jsonb)     |
---------------|-----------------|------------------|
12345          |       Education | [[{"label": "Type", "value": "Under Graduate"},{"label": "Location", "value": "New Delhi"}],[{"label": "Type", "value": "Post Graduate"}]]|

И требуемый вывод:

id    | label               | value          |
------|---------------------|----------------|
12345 | Education_Type_1    | Under Graduate |
12345 | Education_Location_1| New Delhi      |
12345 | Education_Type_2    | Post Graduate  |

Может кто-нибудь помочь мне решить эту проблему, с которой я сталкиваюсь?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Я нашел решение. Спасибо @Fahad Anjum. Я написал решение в верхней части вашей души.

SELECT 
    'Education_' || (jsonb_array_elements(elem)->>'label')::text || '_' || pos::text AS label, jsonb_array_elements(elem)->>'value'
FROM jsonb_array_elements(
    '{"test": [
        [{"label":"Type", "value": "Under Graduate"},{"label":"Location", "value": "New Delhi"},{"label":"CGPA", "value": "9.07"}],
        [{"label":"Type", "value": "Post Graduate"},{"label":"Location", "value": "Bangalore"}],
        [{"label":"Type", "value": "Some education 1"}]]}'::jsonb->'test'
    ) WITH ordinality arr(elem, pos);
0 голосов
/ 28 июня 2018

Так как значение столбца равно многомерному массиву неправильной размерности, мы будем использовать рекурсивный запрос для поиска решения.

Ниже результата запроса в требуемом выводе вы хотите

Я заполнил ваши данные выборки в CTE.


    with recursive cte(id,label,value,dims) as (
     select
      12345,
      'Education'::text,
      '[
        [
         {"label": "Type", "value": "Under Graduate"},
         {"label": "Location", "value":"New Delhi"}
        ],
        [
         {"label": "Type", "value": "Post Graduate"}
        ]
       ]'::jsonb,
      jsonb_array_length('[[{"label": "Type", "value": "Under Graduate"},{"label": "Location", "value": "New Delhi"}],[{"label": "Type", "value": "Post Graduate"}]]'::jsonb)
    ), res(id,label,val,dims) as (
        select cte.id,cte.label,l.v,cte.dims-1
        from cte,lateral(
            select jsonb_array_elements(cte.value) as v
        ) l
        union all
        select
          res.id,res.label,l.v,res.dims-1
        from res,lateral(
           select jsonb_array_elements(res.val) as v
         ) l
        where
         res.dims>0
    )
    select
        res.id,
        res.val->>'value' as value,
        res.label ||
        '_'||
        (res.val->>'label')::text ||
        '_' ||
        row_number() over (partition by id,label,(res.val->>'label')::text) as label
    from res
    where dims=0



0 голосов
/ 28 июня 2018

Вы можете использовать jsonb_array_elements (your_jsonb_column). Протестировано на Postgres 9.6. Вы можете использовать json_array_elements (your_json_column), если вы используете другую версию.

Таблица:

create table test (id int,label text, value jsonb);

Вставить заявление:

insert into test values(12345,'Education','[[{"label": "Type", "value": "Under Graduate"}],[{"label": "Type", "value": "Post Graduate"}]]');
insert into test values(123456,'Education2','[[{"label": "Type2", "value": "Under Graduate2"}],[{"label": "Type2", "value": "Post Graduate2"}]]');

SQL-запрос:

select id, label,jsonb_array_elements(value)->0->>'value'
from test

Где 0 используется для получения первых элементов из массива. - >> используется для удаления кавычек из строки.

Выход:

id  label   value
12345   Education   Under Graduate
12345   Education   Post Graduate
123456  Education2  Under Graduate2
123456  Education2  Post Graduate2

SQL Fiddle

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