Массив json разбивает элементы на столбцы postgres - PullRequest
2 голосов
/ 10 июля 2020

У меня есть этот столбец extra , который равен JSONB из таблицы с именем подписчики , а значение для данного подписчика:

{
  "valid": "N",
  "msisdn": "23490272",
  "account_info": [
    {
      "account_id": 110000616,
      "account_cur": "NGN",
      "account_type": "C",
      "account_class": "ww"
    },
    {
      "account_id": 110000617,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "GHCXLA"
    },
    {
      "account_id": 110000618,
      "account_cur": "EUR",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000619,
      "account_cur": "USD",
      "account_type": "C",
      "account_class": "ww"
    },
    {
      "account_id": 110000620,
      "account_cur": "SAR",
      "account_type": "Y",
      "account_class": "ww"
    },
    {
      "account_id": 110000621,
      "account_cur": "NGN",
      "account_type": "Y",
      "account_class": "ww"
    },
    {
      "account_id": 110000622,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000623,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000624,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000625,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000626,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000627,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000628,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000629,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    },
    {
      "account_id": 110000630,
      "account_cur": "NGN",
      "account_type": "S",
      "account_class": "ww"
    }
  ],
  "preapprovalId": "1517299109619",
  "reservedAmount": 0.0,
  "preapprovalStatus": "APPROVED"
}

Я хочу превратить элементы из account_info в столбцы. Я пробовал это:

select extra #>'{account_info,0}'->>'account_id' Account,extra #>'{account_info,0}'->>'account_cur' Currency,extra #>'{account_info,0}'->>'account_type' Account_Type from subscribers s2 where id = 319;
  account  | currency | account_type
-----------+----------+--------------
 110000616 | NGN      | C

Как мне получить все элементы?

1 Ответ

2 голосов
/ 10 июля 2020

Если я правильно вас понял, вы можете использовать jsonb_array_elements() и боковое соединение, чтобы разделить каждый элемент массива на отдельную строку:

select 
    x.acc ->> 'account_id' account,
    x.acc ->> 'account_cur' currency,
    x.acc ->> 'account_type' account_type
from subscribers s
cross join lateral jsonb_array_elements(s.extra -> 'account_info') as x(acc)
where s.id = 319
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...