web-dev-qa-db-ja.com

UNNESTまたはその他の関数を使用して配列をフラット化する方法は?

1つのフィールドが配列である一時テーブルを取得するとします。それを複数の行に変換する方法を教えてください。

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 at [3:8]

bigQueryでは、UNNESTはFROM句の後にのみ配置できるようです。

それから私はこれらを試しました:

WITH x AS (SELECT ARRAY[1,3,2] AS arr)

SELECT * FROM UNNEST(x)

これはUNNESTをテーブルに適用できないことを示しています:x at [3:22];またはこれ

WITH x AS (SELECT ARRAY[1,3,2] AS row)

SELECT * FROM UNNEST(x.arr)

UNNESTはテーブルに適用できません:x.arr at [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

12
TomasJ

さらに別のバージョン-「明示的な」UNNESTが関与

WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr_item FROM x, UNNEST(arr) as arr_item
12

Xのすべての行でarrの要素のCROSS JOINを実行することにより、このようなフラット化を行うことができます。

WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr FROM x, x.arr

または、コンマを使用する代わりに、CROSS JOINとしてより明示的に記述することができます

WITH x AS (SELECT ARRAY[1,3,2] AS arr)
SELECT arr FROM x CROSS JOIN x.arr
6