What I have:
Orders
orderId | products |
---|---|
12345 | [{"title":"product1","amount":2,"price":5.60},{"title":"product2","amount":1,"price":3.29}] |
What I need:
orderId | title | amount | price |
---|---|---|---|
12345 | product1 | 2 | 5.60 |
12345 | product2 | 1 | 3.29 |
Googling the problem I managed to get this far
with products_array as
(select json_array_elements(products #> '{}')
from Orders)
select
products_array.json_array_elements #>> '{title}' as title,
products_array.json_array_elements #>> '{amount}' as amount,
products_array.json_array_elements #>> '{price}' as price,
from products_array
title | amount | price |
---|---|---|
product1 | 2 | 5.60 |
product2 | 1 | 3.29 |
But I can't figure out how to add orderId for each line.
Can someone help? My knowledge of this is very limited.
CodePudding user response:
You can extract your json objects using JSON_ARRAY_ELEMENTS
, then use a CROSS JOIN LATERAL
to associate them to the corresponding "orderid".
SELECT orderid,
prods ->> 'title' AS title,
prods ->> 'amount' AS amount,
prods ->> 'price' AS price
FROM tab
CROSS JOIN LATERAL JSON_ARRAY_ELEMENTS(tab.products) as prods;
Check the demo here.