below should work, but at least you need to know in advance maximum possible set of columns in your [first] table
Assuming max number of expected columns are 6 - respectivelly: a, b, c, d, e, f
SELECT
id,
REGEXP_EXTRACT(pair, r'(\w+):') AS key,
REGEXP_EXTRACT(pair, r':(\w+)') AS value
FROM (
SELECT
id,
SPLIT(CONCAT(
'a:',IFNULL(STRING(a), ''),
',b:', IFNULL(STRING(b), ''),
',c:', IFNULL(STRING(c), ''),
',d:', IFNULL(STRING(d), ''),
',e:', IFNULL(STRING(e), ''),
',f:', IFNULL(STRING(f), '')
)) AS pair
FROM (
SELECT * FROM
YourTable,
(SELECT NULL AS a, NULL AS b, NULL AS c, NULL AS d, NULL AS e, NULL AS f)
)
)
HAVING NOT value IS NULL
Try below as an example:
SELECT
id,
REGEXP_EXTRACT(pair, r'(\w+):') AS key,
REGEXP_EXTRACT(pair, r':(\w+)') AS value
FROM (
SELECT
id,
SPLIT(CONCAT(
'a:',IFNULL(STRING(a), ''),
',b:', IFNULL(STRING(b), ''),
',c:', IFNULL(STRING(c), ''),
',d:', IFNULL(STRING(d), ''),
',e:', IFNULL(STRING(e), ''),
',f:', IFNULL(STRING(f), '')
)) AS pair
FROM (
SELECT * FROM
(SELECT 1 AS id, 1 AS a, 2 AS b, 3 AS c),
(SELECT 2 AS id, 4 AS a, 5 AS b, 6 AS c, 7 AS d),
(SELECT 3 AS id, 8 AS a, 9 AS b, 10 AS c, 11 AS e),
(SELECT NULL AS id, NULL AS a, NULL AS b, NULL AS c, NULL AS d, NULL AS e, NULL AS f)
)
)
HAVING NOT value IS NULL
Added for: i'm looking for a solution without union or knowing the max number of expected columns
using client side code - you can
a) get schema of the table Tables: get API
b) build dynamic sql like in above answer (w/o union now)
c) execute sql