Перенос плоского jsonb в hstore

Я запускаю postgres 9.4 и хочу перенести столбец в моей таблице базы данных в hstore, чтобы иметь возможность сравнить производительность.

Мой текущий столбец представляет собой пару ключ-значение в jsonb без вложенной структуры.

Любые советы, как подойти к этой проблеме?


person vedar    schedule 07.10.2015    source источник


Ответы (1)


Пример данных:

create table jsons (id int, val jsonb);
insert into jsons values
(1, '{"age":22}'), 
(2, '{"height":182}'),
(3, '{"age":30, "height":177}');

Разделить объекты json на пары key, value:

    select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
    from jsons

 id |  key   | value 
----+--------+-------
  1 | age    | 22
  2 | height | 182
  3 | age    | 30
  3 | height | 177
(4 rows)        

Соедините пары и преобразуйте их в hstore:

select id, hstore(array_agg(key), array_agg(value))
from (
    select id, (jsonb_each_text(val)).key, (jsonb_each_text(val)).value
    from jsons
    ) sub
group by 1
order by 1

 id |            hstore            
----+------------------------------
  1 | "age"=>"22"
  2 | "height"=>"182"
  3 | "age"=>"30", "height"=>"177"
(3 rows)    

То же самое можно сделать более элегантным способом, используя боковое соединение:

select id, hstore(array_agg(key), array_agg(value))
from jsons
cross join jsonb_each_text(val)
group by 1
order by 1;
person klin    schedule 07.10.2015
comment
последний фрагмент кода помог мне, как и вам. спасибо также другим за пошаговое руководство - person vedar; 07.10.2015
comment
Первый был только для иллюстрации второго (чтобы лучше понять запрос). Пожалуйста. - person klin; 07.10.2015