【问题标题】:How to flatten an array with UNNEST or any other functions?如何使用 UNNEST 或任何其他函数展平数组?
【发布时间】:2017-02-10 06:54:02
【问题描述】:

假设我得到一个临时表,其中一个字段是一个数组,如何将它变成多行?

对于 PostgreSQL,这可以通过 UNNEST http://sqlfiddle.com/#!15/21673/19 完成

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

SELECT UNNEST(arr) FROM x

在 BigQuery 中运行相同的查询说 语法错误:意外 [3:8] 处的关键字 UNNEST

似乎在 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

【问题讨论】:

  • Google 的任何人都可以回答为什么不支持 Postgres 样式标准SELECT UNNEST(ARRAY[1,3,2])

标签: google-bigquery


【解决方案1】:

另一个版本 - 涉及“显式”UNNEST

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

【讨论】:

  • 这里的两个答案都可以作为解决方法;但任何人都知道为什么不支持 Postgres 标准 SELECT UNNEST(...) 为什么不允许 UNNEST 函数在任何地方都可用
  • 但是如果谷歌没有人可以在这里回答;感觉这个FROM x, UNNEST(arr) as arr_item比较直观好理解
【解决方案2】:

您可以通过将 arr 的元素与 x 的每一行进行 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

【讨论】:

    【解决方案3】:

    如果要按数组创建普通表,可以在 FROM 语句中使用 UNNEST。

    WITH x AS (
      SELECT
        *
      FROM
        UNNEST([1,2,3]) as num
    )
    
    select * from x
    

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 2012-05-13
      • 2020-04-11
      • 2013-12-19
      • 2018-05-12
      • 2018-02-09
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多