Альтернативный вариант для BigQuery Standard SQL
#standardSQL
SELECT id, name, num
FROM `project.dataset.table`,
UNNEST(SPLIT(names, '|')) name WITH OFFSET
JOIN UNNEST(SPLIT(nums, '|')) num WITH OFFSET
USING(OFFSET)
Если применяется к образцам данных в вашем вопросе, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'x' id, 'a|b|c' names, '3|9|5' nums UNION ALL
SELECT 'y', 'd', '1' UNION ALL
SELECT 'z', 'e|f', '4|7'
)
SELECT id, name, num
FROM `project.dataset.table`,
UNNEST(SPLIT(names, '|')) name WITH OFFSET
JOIN UNNEST(SPLIT(nums, '|')) num WITH OFFSET
USING(OFFSET)
результат равен
Row id name num
1 x a 3
2 x b 9
3 x c 5
4 y d 1
5 z e 4
6 z f 7
Выше можно реорганизовать использование UDF, поэтому основной запрос становится простым и читабельным - как в следующем примере
#standardSQL
CREATE TEMP FUNCTION xxx(arr1 ANY TYPE, arr2 ANY TYPE)
RETURNS ARRAY<STRUCT<name STRING, num STRING>> AS (
ARRAY(
SELECT AS STRUCT el1, el2
FROM UNNEST(SPLIT(arr1, '|')) el1 WITH OFFSET
JOIN UNNEST(SPLIT(arr2, '|')) el2 WITH OFFSET
USING(OFFSET)
));
SELECT id, x.*
FROM `project.dataset.table`, UNNEST(xxx(names, nums)) x
, очевидно, с тем же выводом