Как преобразовать массив массива jsonb в записи - PullRequest
0 голосов
/ 03 мая 2018

Учитывая массив объектов, мы можем очень легко превратить его в набор записей с помощью jsonb_to_recordset.

select * from jsonb_to_recordset($$[
  {"name": "name01", "age": 12},
  {"name": "name02", "age": 14},
  {"name": "name03", "age": 16},
  {"name": "name04", "age": 18}
]$$) as (name text, age int)


name   |age |
-------|----|
name01 |12  |
name02 |14  |
name03 |16  |
name04 |18  |

Но что мы можем сделать, если мы предпочитаем исходные данные в виде массива массива? Как преобразовать запрос ниже, чтобы получить результат, аналогичный приведенному выше?

select array['name', 'age']  "labels"
     , x.value               "values" 
from jsonb_array_elements($$[
  ["name01", 12],
  ["name02", 14],
  ["name03", 16],
  ["name04", 18]
]$$) x


labels     |values         |
-----------|---------------|
{name,age} |["name01", 12] |
{name,age} |["name02", 14] |
{name,age} |["name03", 16] |
{name,age} |["name04", 18] |

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете использовать ->>:

select x.value->>0 AS name,
       x.value->>1 AS age     
from jsonb_array_elements($$[
  ["name01", 12],
  ["name02", 14],
  ["name03", 16],
  ["name04", 18]
]$$) x;

Выход:

+--------+-----+
|  name  | age |
+--------+-----+
| name01 |  12 |
| name02 |  14 |
| name03 |  16 |
| name04 |  18 |
+--------+-----+

Демоверсия DBFiddle

...