Как выровнять массив с помощью UNNEST или любых других функций?

#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 |
 ----- 
  

https://cloud.google.com/bigquery/sql-reference/arrays

Комментарии:

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