【发布时间】:2016-12-24 22:27:53
【问题描述】:
我有一个 Postgres 表,其内容类似于:
id | data
1 | {"a":"4", "b":"5"}
2 | {"a":"6", "b":"7"}
3 | {"a":"8", "b":"9"}
第一列是整数,第二列是json列。
我希望能够扩展 json 中的键和值,因此结果如下所示:
id | key | value
1 | a | 4
1 | b | 5
2 | a | 6
2 | b | 7
3 | a | 8
3 | b | 9
这可以在 Postgres SQL 中实现吗?
我的尝试
鉴于原始表格可以这样模拟:
select *
from
(
values
(1, '{"a":"4", "b":"5"}'::json),
(2, '{"a":"6", "b":"7"}'::json),
(3, '{"a":"8", "b":"9"}'::json)
) as q (id, data)
我可以使用以下方法获取密钥:
select id, json_object_keys(data::json)
from
(
values
(1, '{"a":"4", "b":"5"}'::json),
(2, '{"a":"6", "b":"7"}'::json),
(3, '{"a":"8", "b":"9"}'::json)
) as q (id, data)
我可以像这样将它们作为记录集获取:
select id, json_each(data::json)
from
(
values
(1, '{"a":"4", "b":"5"}'::json),
(2, '{"a":"6", "b":"7"}'::json),
(3, '{"a":"8", "b":"9"}'::json)
) as q (id, data)
但我不知道如何通过 id、key 和 value 来实现结果。
有什么想法吗?
注意:我正在使用的真正的 json 比这更嵌套,但我认为这个例子很好地代表了我的潜在问题。
【问题讨论】:
-
使用函数
json_object_keys或json_each作为表格,而不是作为列:select id, j.key, j.value from my_table, json_each(data) j -
感谢 Abelisto。当然,使用您建议的查询,我最终会得到一个完整的笛卡尔积,而不是我正在寻找的表?
标签: json postgresql jsonb