Home > Software engineering >  Split JSON into column in postgressql
Split JSON into column in postgressql

Time:12-31

I have this simple table

create table orders 
(
  order_id int,
  address json
);
insert into orders(  order_id, address)
values
(1, '[{"purchase": "online", "address": {"state": "LA", "city": "Los Angeles", "order_create_date": "2022-12-01T14:37:48.222-06:00"}}]'),
(2, '[{"purchase": "instore", "address": {"state": "WA", "city": "Seattle", "order_create_date": "2022-12-01T14:37:48.222-06:00"}}]'),
(3, '[{"purchase": "online", "address": {"state": "GA", "city": "Atlanta", "order_create_date": "2022-12-01T14:37:48.222-06:00"}}]'); 

so far I was able to split purchase and address into two column

select
order_id,
(address::jsonb)->0->>'purchase' as purchasetype,
(address::jsonb)->0->>'address' as address
from orders;
1   online  {"city": "Los Angeles", "state": "LA", "order_create_date": "2022-12-01T14:37:48.222-06:00"}
2   instore {"city": "Seattle", "state": "WA", "order_create_date": "2022-12-01T14:37:48.222-06:00"}
3   online  {"city": "Atlanta", "state": "GA", "order_create_date": "2022-12-01T14:37:48.222-06:00"}

but I was wondering if anyone can help with how I can also split the address into 3 column(state, city, order_created_date)

I tried to subquery but won't work

I would like to see something like this

1 | online | Los Angeles | LA | 2022-12-01T14:37:48.222-06:00

2 | instore | Seattl | WA | 2022-12-01T14:37:48.222-06:00

3 | online | Atlanta | GA | 2022-12-01T14:37:48.222-06:00

CodePudding user response:

Try this :

SELECT o.order_id
     , a->>'purchase' AS purchasetype
     , a->'address'->>'state' AS state
     , a->'address'->>'city' AS city
     , a->'address'->>'order_create_date' AS order_created_date
  FROM orders o
 CROSS JOIN LATERAL jsonb_path_query(o.address, '$[*]') a

Result :

order_id purchasetype state city order_created_date
1 online LA Los Angeles 2022-12-01T14:37:48.222-06:00
2 instore WA Seattle 2022-12-01T14:37:48.222-06:00
3 online GA Atlanta 2022-12-01T14:37:48.222-06:00

see dbfiddle

  • Related