Extrair chave, valor de objetos json no Postgres
Eu tenho uma tabela do Postgres que possui conteúdo semelhante a este:
id | data
1 | {"a":"4", "b":"5"}
2 | {"a":"6", "b":"7"}
3 | {"a":"8", "b":"9"}
A primeira coluna é um número inteiro e a segunda é uma coluna json.
Eu quero poder expandir as chaves e os valores do json para que o resultado fique assim:
id | key | value
1 | a | 4
1 | b | 5
2 | a | 6
2 | b | 7
3 | a | 8
3 | b | 9
Isso pode ser alcançado no Postgres SQL?
O que eu tentei
Dado que a tabela original pode ser simulada como tal:
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)
Posso obter apenas as chaves usando:
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)
E posso obtê-los como conjuntos de registros como este:
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)
Mas não consigo descobrir como alcançar o resultado com identificação, chave e valor.
Alguma ideia?
Nota: o json real com o qual estou trabalhando é significativamente mais aninhado que isso, mas acho que este exemplo representa bem o meu problema subjacente.