Как извлечь JSON в таблицу - PullRequest
0 голосов
/ 05 июня 2018

У меня есть база данных, заполненная документом json, по одному на строку, например:

[{
    "ID": "TOT",
    "type": "ABS",
    "value": "32.0"
},
{
    "ID": "T1",
    "type": "ABS",
    "value": "9.0"
},
{
    "ID": "T2",
    "type": "ABS",
    "value": "8.0"
},
{
    "ID": "T3",
    "type": "ABS",
    "value": "15.0"
}]

Мне нужно извлечь эту информацию, чтобы вставить данные в таблицу, подобную этой:

     pod          T1    T2    T3    TOT
IT001E18486545    9.0   8.0  15.0   32.0

Я пытался со следующим:

select pod, json_array_elements(jsond::json) ->>'value' as value, 
json_array_elements(jsond::json) ->>'ID' as ID,  
json_array_elements(jsond::json) ->>'type' as stype
from tst_json

но таким образом у меня получился такой результат

this

, который мне не нужен.

1 Ответ

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

Вы можете поворачивать данные, используя конструкцию case ... then ... end:

select 
    pod, 
    case when value->>'ID' = 'T1' then value->>'value' end as "T1",
    case when value->>'ID' = 'T2' then value->>'value' end as "T2",
    case when value->>'ID' = 'T3' then value->>'value' end as "T3",
    case when value->>'ID' = 'TOT' then value->>'value' end as "TOT"
from tst_json
cross join json_array_elements(jsond)

      pod       | T1  | T2  |  T3  | TOT  
----------------+-----+-----+------+------
 IT001E18486545 |     |     |      | 32.0
 IT001E18486545 | 9.0 |     |      | 
 IT001E18486545 |     | 8.0 |      | 
 IT001E18486545 |     |     | 15.0 | 
(4 rows)

Используйте max() и group by, чтобы получить по одной строке для каждого pod и избавиться от нулей:

select 
    pod, 
    max(case when value->>'ID' = 'T1' then value->>'value' end) as "T1",
    max(case when value->>'ID' = 'T2' then value->>'value' end) as "T2",
    max(case when value->>'ID' = 'T3' then value->>'value' end) as "T3",
    max(case when value->>'ID' = 'TOT' then value->>'value' end) as "TOT"
from tst_json
cross join json_array_elements(jsond)
group by pod

      pod       | T1  | T2  |  T3  | TOT  
----------------+-----+-----+------+------
 IT001E18486545 | 9.0 | 8.0 | 15.0 | 32.0
(1 row) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...