Nie możesz tego zrobić „dynamicznie”. Musisz określić kolumny, które chcesz mieć:
select name, description, id,
data ->> 'tax' as tax,
data ->> 'other_attribute' as other_attribute
from core;
Jeśli robisz to często, możesz umieścić to w widoku.
Inną opcją jest utworzenie w Postgresie typu obiektu, który reprezentuje atrybuty w Twoim JSON, np.
create type core_type as (id integer, tax numeric, price numeric, code varchar);
Następnie możesz rzutować JSON na ten typ, a odpowiednie atrybuty z JSON zostaną automatycznie przekonwertowane na kolumny:
Z powyższym typem i następującym JSON:{"id": "100", "tax": "4.5", "price": "10", "code": "YXCV"}
możesz zrobić:
select id, (json_populate_record(null::core_type, data)).*
from core;
i wróci:
id | tax | price | code
---+------+-------+-----
1 | 4.50 | 10 | YXCV
Musisz jednak upewnić się, że każda wartość JSON może być rzutowane na typ odpowiedniego pola obiektu.
Jeśli zmienisz typ obiektu, każde używające go zapytanie zostanie automatycznie zaktualizowane. Możesz więc zarządzać interesującymi Cię kolumnami za pomocą centralnej definicji.