Конвертировать несколько Json массив в один массив, а не массив внутри родительского массива - PullRequest
1 голос
/ 26 февраля 2020

У меня есть следующие 2 Json в 2 ряда.

  {
            "attributes": [{
                "name": "text-1580797977710",
                "value": "Nikesh Niroula"
            }, {
                "name": "email-1580797979166",
                "value": "nikesh@gmail.com"
            }]
          }


{
    "attributes": [{
            "name": "text-1580797977720",
            "value": "Denver"
        }, {
            "name": "text-1580797977723",
            "value": "colarado"
        },
        {
            "name": "text-1580797977727",
            "value": "USA"
        }
    ]
}

Мне нужно, чтобы вышеприведенные json были объединены в один массив с помощью postgresql, ожидаемый результат будет таким, как показано ниже. Я попытался использовать json_agg, но это добавит внутренний массив в основной массив. Может быть несколько json, а не только 2.

  {
        "attributes": [{
                "name": "text-1580797977710",
                "value": "Nikesh Niroula"
            }, {
                "name": "email-1580797979166",
                "value": "nikesh@gmail.com"
            }, {
                "name": "text-1580797977720",
                "value": "Denver"
            }, {
                "name": "text-1580797977723",
                "value": "colarado"
            },
            {
                "name": "text-1580797977727",
                "value": "USA"
            }
        ]

     }

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Вам необходимо удалить их перед тем, как передать их в функцию agg. Если таблица «j», а столбец «x», то:

select jsonb_build_object('attributes',jsonb_agg(value))
   from j, jsonb_array_elements(x->'attributes');
0 голосов
/ 26 февраля 2020

Вы можете использовать оператор конкатенации (||) вместе с jsonb_array_elements jsonb_agg функциями для решения вашей проблемы.

with t (id,
attr1,
attr2) as (
values (1,
'{
      "attributes": [
        {
          "name": "one-1",
          "value": "Nikesh Niroula"
        }]}'::jsonb,
'{"attributes": [
        {
          "name": "one-2",
          "value": "Nikesh Niroula"
        }]}'::jsonb) ,
(1,
'{
      "attributes": [
        {
          "name": "two-1",
          "value": "Nikesh Niroula"
        }]}'::jsonb,
'{"attributes": [
        {
          "name": "two-2",
          "value": "Nikesh Niroula"
        }]}'::jsonb) ,
(1,
'{
      "attributes": [
        {
          "name": "three-1",
          "value": "Nikesh Niroula"
        }]}'::jsonb,
'{"attributes": [
        {
          "name": "three-2",
          "value": "Nikesh Niroula"
        }]}'::jsonb) ,
(2,
'{
      "attributes": [
        {
          "name": "four-1",
          "value": "Nikesh Niroula"
        }]}'::jsonb,
'{"attributes": [
        {
          "name": "four-2",
          "value": "Nikesh Niroula"
        }]}'::jsonb) )
select
    id ,
    jsonb_agg(value)
from
    t,
    jsonb_array_elements(attr1->'attributes' ||(attr2->'attributes'))
group by
    1;
...