【发布时间】:2016-08-20 08:03:47
【问题描述】:
我有一个表(表 A),其中包含一个包含 JSON 编码数据的文本列。
JSON 数据始终是一个包含一到几千个普通对象的数组。
我有另一个表(表 B)有几列,包括一个数据类型为“JSON”的列
我想从表 A 中选择所有行,将 json 数组拆分为其元素并将每个元素插入到表 B 中
奖励目标:每个对象(几乎)总是有一个键,x。我想将x 的值提取到列中,并从原始对象中删除x(如果存在)。
例如:表 A
| id | json_array (text) |
+----+--------------------------------+
| 1 | '[{"x": 1}, {"y": 8}]' |
| 2 | '[{"x": 2, "y": 3}, {"x": 1}]' |
| 3 | '[{"x": 8, "z": 2}, {"z": 3}]' |
| 4 | '[{"x": 5, "y": 2, "z": 3}]' |
...将变为:表 B
| id | a_id | x | json (json) |
+----+------+------+--------------------+
| 0 | 1 | 1 | '{}' |
| 1 | 1 | NULL | '{"y": 8}' |
| 2 | 2 | 2 | '{"y": 3}' |
| 3 | 2 | 1 | '{}' |
| 4 | 3 | 8 | '{"y": 2}' |
| 5 | 3 | NULL | '{"z": 3}' |
| 6 | 4 | 5 | '{"y": 2, "z": 3}' |
这最初必须处理几百万行,然后需要定期运行,因此提高效率将是当务之急。
是否可以在不使用循环和 PL/PgSQL 的情况下做到这一点?我的进步不大。
【问题讨论】:
-
你可以使用
jsonb(即PG9.5)吗?json数据类型不适合操作对象,而jsonb有更多选项。使用jsonb删除x很容易,使用json更复杂。
标签: sql json postgresql