我有一个表(表A),其中包含一个包含JSON编码数据的文本列。PosgreSQL:高效地将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'。 – Patrick