Ниже для BigQuery Standard SQL
#standardSQL
CREATE TEMP FUNCTION combine(s ANY TYPE) AS ((
SELECT STRING_AGG(x ORDER BY OFFSET)
FROM UNNEST(SPLIT(REGEXP_REPLACE(FORMAT('%t', s), r'\)$', ''))) x WITH OFFSET
WHERE OFFSET > 0
));
SELECT id, combine(t) AS combined_columns
FROM `project.dataset.table` t
ORDER BY id
Вы можете протестировать, поиграть с ним, используя фиктивные данные, как в примере ниже
#standardSQL
CREATE TEMP FUNCTION combine(s ANY TYPE) AS ((
SELECT STRING_AGG(x ORDER BY OFFSET)
FROM UNNEST(SPLIT(REGEXP_REPLACE(FORMAT('%t', s), r'\)$', ''))) x WITH OFFSET
WHERE OFFSET > 0
));
WITH `project.dataset.table` AS (
SELECT 1 id, '{"a":1}' col1, '{"b":2}' col2, '{"c":3}' col3 UNION ALL
SELECT 2 id, '{"d":4}' col1, '{"e":5}' col2, '{"f":6}' col3
)
SELECT id, combine(t) AS combined_columns
FROM `project.dataset.table` t
ORDER BY id
с результатом
Row id combined_columns
1 1 {"a":1}, {"b":2}, {"c":3}
2 2 {"d":4}, {"e":5}, {"f":6}
Если вы хотите, чтобы объединенное значение было массивом - замените STRING_AGG () на ARRAY_AGG (), и результат будет
Row id combined_columns
1 1 {"a":1}
{"b":2}
{"c":3}
2 2 {"d":4}
{"e":5}
{"f":6}
Очевидно, что вышеприведенное применимо для любого числа столбцов, если первый столбец - id
и col1 thru colx are all of type STRING
, как указано в вопросе. Иными словами, выше необходимо немного скорректировать - но это были бы довольно незначительные изменения ...