Use
jsonb_populate_record()
(ou json_populate_record()
para json
) com um tipo de linha bem conhecido como destino. Você pode usar uma tabela temporária para registrar um tipo para uso ad-hoc (se você não puder usar uma tabela existente tabela ou tipo composto personalizado):CREATE TEMP TABLE obj(a int, b int, c int, d int);
Então:
SELECT t.id, d.*
FROM test t
, jsonb_populate_record(null::obj, t.data) d;
Ou use
jsonb_to_record()
(ou json_to_record()
para json
) e forneça uma lista de definição de coluna com a chamada:SELECT t.id, d.*
FROM test t
, jsonb_to_record(t.data) d(a int, b int, c int, d int);
Ou extrair e converter cada campo individualmente:
SELECT id, (data->>'a')::int AS a, (data->>'b')::int AS b
, (data->>'c')::int AS c, (data->>'d')::int AS d
FROM test;
Todos os três funcionam para
json
e jsonb
parecido. Basta usar a respectiva variante de função. Relacionado: