web-dev-qa-db-fra.com

Comment aplatir un tableau avec UNNEST ou toute autre fonction?

Supposons que j'obtienne une table temporaire avec un champ est un tableau, comment la transformer en plusieurs lignes?

Avec PostgreSQL, cela peut être fait avec UNNEST http://sqlfiddle.com/#!15/21673/19

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

SELECT UNNEST(arr) FROM x

Exécutez la même requête dans BigQuery dit Erreur de syntaxe: mot-clé inattendu UNNEST à [3: 8]

il semble que dans BigQuery l'UNNEST ne peut être placé qu'après la clause FROM,

Ensuite, j'ai essayé ces derniers:

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

SELECT * FROM UNNEST(x)

celui-ci dit UNNEST ne peut pas être appliqué sur une table: x à [3:22] ; ou ca

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

SELECT * FROM UNNEST(x.arr)

dit UNNEST ne peut pas être appliqué sur une table: x.arr à [3:22]

BTW, la table temporaire actuelle x ressemble à ceci:

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

SELECT * FROM x
EOF

+--------------+
|     row      |
+--------------+
| [u'1', u'2'] |
+--------------+

alors que je m'attends à le transformer en lignes de valeur:

+-----+
| row |
+-----+
|   1 |
|   2 |
+-----+

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

12
TomasJ

Encore une autre version - avec UNNEST "explicite" impliqué

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

Vous pouvez faire un tel aplatissement en faisant CROSS JOIN des éléments d'arr avec chaque ligne de x, c'est-à-dire.

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

ou vous pouvez l'écrire plus explicitement en tant que CROSS JOIN au lieu d'utiliser une virgule

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