【发布时间】:2017-09-07 21:34:18
【问题描述】:
给定一个类似于以下的现有数据结构:
CREATE TEMP TABLE sample (id int, metadata_array jsonb, text_id_one jsonb, text_id_two jsonb);
INSERT INTO sample
VALUES ('1', '[{"id": "textIdOne", "data": "foo"},{"id": "textIdTwo", "data": "bar"}]'), ('2', '[{"id": "textIdOne", "data": "baz"},{"id": "textIdTwo", "data": "fiz"}]');
我正在尝试将 jsonb 对象数组从现有 元数据 列展开到同一个表中的新 jsonb 列中;我已经根据已知的固定 id 键列表创建了 textIdOne、textIdTwo 等。
我以为我很接近使用jsonb_populate_recordset(),但后来意识到这将根据所有 jsonb 对象的键填充列;不是我想要的。期望的结果是基于对象 ID 的每列对象。
此操作的唯一另一个棘手的部分是我的 JSON 对象的 id 值使用 camelCase 似乎应该避免引用/大小写的列名,但我不介意引用或修改列名作为意味着结束&一旦更新查询完成,我可以根据需要手动更改列名。
我使用的是 PostgreSQL 9.5.2
现有数据和结构:
id | metadata_array jsonb | text_id_one jsonb | text_id_two jsonb
---------------------------------------------------------------------------------------------
1 | [{"id": "textIdOne"...}, {"id": "textIdTwo"...}] | NULL | NULL
2 | [{"id": "textIdOne"...}, {"id": "textIdTwo"...}] | NULL | NULL
想要的结果:
id | metadata_array jsonb | text_id_one jsonb | text_id_two jsonb
-------------------------------------------------------------------------------
1 | [{"id": "textIdOne",... | {"id": "textIdOne"...} | {"id": "textIdTwo"...}
2 | [{"id": "textIdOne",... | {"id": "textIdOne"...} | {"id": "textIdTwo"...}
说明:
感谢大家迄今为止的回答!虽然我知道完整的键列表(大约 9 个),但我不能指望顺序一致。
【问题讨论】:
标签: sql postgresql