#google-bigquery
#google-bigquery
Вопрос:
Предположим, я получаю временную таблицу, одно поле которой является массивом, как превратить его в несколько строк?
С PostgreSQL это можно сделать с помощью UNNEST http://sqlfiddle.com /#!15/21673/19
WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT UNNEST(arr) FROM x
Запустите тот же запрос в BigQuery, и он выдает синтаксическую ошибку: неожиданное ключевое слово UNNEST в [3:8]
кажется, в BigQuery UNNEST может быть помещен только после предложения FROM,
Затем я попробовал эти:
WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT * FROM UNNEST(x)
в этом говорится, что UNNEST не может быть применен к таблице: x в [3:22]; или это
WITH x AS (SELECT ARRAY[1,3,2] AS row)
SELECT * FROM UNNEST(x.arr)
говорит, что UNNEST не может быть применен к таблице: x.arr в [3:22]
Кстати, текущая временная таблица x выглядит так:
WITH x AS (SELECT ARRAY[1,2] AS row)
SELECT * FROM x
EOF
--------------
| row |
--------------
| [u'1', u'2'] |
--------------
пока я ожидаю превратить его в строки значений:
-----
| row |
-----
| 1 |
| 2 |
-----
Комментарии:
1. любой пользователь Google может ответить, почему не поддерживается стандарт стиля Postgres
SELECT UNNEST(ARRAY[1,3,2])
Ответ №1:
Еще одна версия — с использованием «явного» UNNEST
WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr_item FROM x, UNNEST(arr) as arr_item
Комментарии:
1. оба ответа здесь работают как обходной путь; но кто-нибудь знает, почему не поддерживается стандарт Postgres
SELECT UNNEST(...)
, почему бы не разрешить использовать функцию UNNEST где угодно2. но если никто из Google не может ответить здесь; Я чувствую, что это
FROM x, UNNEST(arr) as arr_item
более интуитивно понятно
Ответ №2:
Вы можете сделать такое сглаживание, выполнив ПЕРЕКРЕСТНОЕ объединение элементов arr с каждой строкой x, т.е.
WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr FROM x, x.arr
или вы можете записать это более явно как ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ вместо использования запятой
WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr FROM x CROSS JOIN x.arr
Ответ №3:
Если вы хотите создать обычную таблицу по массиву, вы можете использовать UNNEST в инструкции FROM .
WITH x AS (
SELECT
*
FROM
UNNEST([1,2,3]) as num
)
select * from x