Reputation: 1033
I have a result of a query that looks like this:
|KEY |VALUE |
----------------------------
|C1| |{1,2,3,4,5} |
|C2| |{ 'a','b','c','d','e'}|
|C3| |{1.0,2.0,3.0,4.0,5.0} |
How to convert it into:
|C1|C2 |C3 |
-----------
|1 |'a'|1.0|
|2 |'b'|2.0|
|3 |'c'|3.0|
|4 |'d'|4.0|
|5 |'d'|5.0|
Upvotes: 0
Views: 205
Reputation: 25938
SELECT Record.Key, Record.Value
FROM (
SELECT parse_json('{"C1":[1,2,3,4,5],"C2":[ \'a\',\'b\',\'c\',\'d\',\'e\'],"C3":[1.0,2.0,3.0,4.0,5.0]}') as json
) , LATERAL FLATTEN (input=> json, MODE=>'OBJECT' ) as Record ;
gives:
KEY VALUE
C1 [ 1, 2, 3, 4, 5 ]
C2 [ "a", "b", "c", "d", "e" ]
C3 [ 1, 2, 3, 4, 5 ]
so if you have a single object of JSON that you want the equal sized arrays of values:
SELECT
json:C1[r.index] as C1
,json:C2[r.index] as C2
,json:C3[r.index] as C3
FROM (
SELECT parse_json('{"C1":[1,2,3,4,5],"C2":[ \'a\',\'b\',\'c\',\'d\',\'e\'],"C3":[1.0,2.0,3.0,4.0,5.0]}') as json
) , LATERAL FLATTEN (input=> json:C1, MODE=>'ARRAY' ) as r ;
gives
C1 C2 C3
1 "a" 1
2 "b" 2
3 "c" 3
4 "d" 4
5 "e" 5
where-as if you have many batches of the above object types in an array:
SELECT
r.index as batch
,r.value:C1[q.index] as C1
,r.value:C2[q.index] as C2
,r.value:C3[q.index] as C3
FROM (
SELECT parse_json('[{"C1":[1,2,3,4,5],"C2":[ \'a\',\'b\',\'c\',\'d\',\'e\'],"C3":[1.0,2.0,3.0,4.0,5.0]},{"C1":[6,7,8,9,10],"C2":[ \'a\',\'b\',\'c\',\'d\',\'e\'],"C3":[11.0,12.0,13.0,14.0,15.0]}]') as json
) , LATERAL FLATTEN (input=> json, MODE=>'ARRAY' ) as r
, LATERAL FLATTEN (input=> r.value:C1, MODE=>'ARRAY' ) as q;
gives:
BATCH C1 C2 C3
0 1 "a" 1
0 2 "b" 2
0 3 "c" 3
0 4 "d" 4
0 5 "e" 5
1 6 "a" 11
1 7 "b" 12
1 8 "c" 13
1 9 "d" 14
1 10 "e" 15
Upvotes: 1