Необходимо явно указать столбцы в списке выбора; сами колонки не могут быть динамическими. Если все в порядке с получением результатов обратно в массив, вы могли бы сделать что-то вроде этого:
#standardSQL
WITH T AS (
SELECT '/A/B/C/17628.html' AS path UNION ALL
SELECT '/A/D/E/F/178.html' AS path
)
SELECT
ARRAY(SELECT IFNULL(subpaths[SAFE_OFFSET(x)], '')
FROM UNNEST(GENERATE_ARRAY(0, 19)) AS x) AS paths
FROM (
SELECT SPLIT(path, '/') AS subpaths
FROM T
);
Если вы хотите явные path_1
, path_2
и т.д. столбцы можно сделать:
#standardSQL
WITH T AS (
SELECT '/A/B/C/17628.html' AS path UNION ALL
SELECT '/A/D/E/F/178.html' AS path
)
SELECT
subpaths[SAFE_OFFSET(1)] AS path_1,
subpaths[SAFE_OFFSET(2)] AS path_2,
subpaths[SAFE_OFFSET(3)] AS path_3,
subpaths[SAFE_OFFSET(4)] AS path_4,
subpaths[SAFE_OFFSET(5)] AS path_5,
subpaths[SAFE_OFFSET(6)] AS path_6,
subpaths[SAFE_OFFSET(7)] AS path_7,
subpaths[SAFE_OFFSET(8)] AS path_8,
subpaths[SAFE_OFFSET(9)] AS path_9,
subpaths[SAFE_OFFSET(10)] AS path_10,
subpaths[SAFE_OFFSET(11)] AS path_11,
subpaths[SAFE_OFFSET(12)] AS path_12,
subpaths[SAFE_OFFSET(13)] AS path_13,
subpaths[SAFE_OFFSET(14)] AS path_14,
subpaths[SAFE_OFFSET(15)] AS path_15,
subpaths[SAFE_OFFSET(16)] AS path_16,
subpaths[SAFE_OFFSET(17)] AS path_17,
subpaths[SAFE_OFFSET(18)] AS path_18,
subpaths[SAFE_OFFSET(19)] AS path_19,
subpaths[SAFE_OFFSET(20)] AS path_20
FROM (
SELECT SPLIT(path, '/') AS subpaths
FROM T
);
С Я не хотел, чтобы написать этот список вручную, я побежал простой однострочник в моем терминале:
for i in `seq 1 20`; do echo "subpaths[SAFE_OFFSET($i)] AS path_$i,"; done
Что такое ожидаемый вывод запроса, учитывая URI '' /A/B/C/17628.html? '? Невозможно создать столбцы динамически - если вы не делаете этого в своем собственном коде, - но есть ли намерение получить пять строк, в которых каждый содержит часть URI? –
У моего набора данных есть в первом столбце URI.Вывод запроса должен иметь в столбцах разные подкаталоги (путь1, путь2 ... путь). Если URI имеет 1 подкаталог, path2 ... pathn будет заполнен как null. –
Я хочу что-то вроде этого (код неправильный): SELECT FOR (i от 1 до MAX (LENGTH (URI) -LENGTH (REPLACE (URI, '/', ''))) AS CONCAT (путь, i) FROM [my_table_URI] –