Вероятно, ужасно неэффективно, но это делает работу:
DROP TABLE IF EXISTS source_table;
CREATE TEMP TABLE source_table ( field_a JSONB );
DROP TABLE IF EXISTS target_table;
CREATE TEMP TABLE target_table ( field TEXT, value1 JSONB, value2 JSONB );
INSERT INTO source_table VALUES
('{"a":["1", "2"]}'),
('{"b":["foo", "bar"]}'),
('{"a":[null, 3]}');
INSERT INTO target_table
SELECT
tmp.obj->>'key',
COALESCE( TO_JSONB(((tmp.obj->'value')::JSONB)->0), 'null' ),
COALESCE( TO_JSONB(((tmp.obj->'value')::JSONB)->1), 'null' )
FROM (
SELECT TO_JSON(x) obj FROM (SELECT JSONB_EACH(field_a) x FROM source_table) AS x
) AS tmp;
SELECT * FROM target_table;
приводит к:
field|value1|value2
===================
"a" | "1"| "2"|
"b" | "foo"| "bar"|
"a" | null| 3|
Где value1
и value2
- это JSONB
столбцы и null
сохраняется как JSONB
.
Кроме того, даже если вы указали, что каждый объект содержит только один ключ, приведенное выше решение будет работать независимо от того, сколько ключей оно содержит.
PosgreSQL 9.5+