首页 > 解决方案 > 为什么只在“from”子句之后才提供 UNNEST

问题描述

为什么只在“from”子句之后才提供 UNNEST

例如,此查询失败并显示错误为“语法错误:[2:8] 处的意外关键字 UNNEST”

WITH groc as (select ["ram"] as list) SELECT UNNEST(list) FROM groc

尽管

这个运行成功

WITH groc as (select ["ram"] as list) SELECT (select * from UNNEST(list)) FROM groc

标签: google-bigquery

解决方案


UNNEST 是一个表值函数,通常用于数组构造、展平、过滤等 - 因此返回带有行等的表,因此您需要牢记这一点来使用它。你不能只是select table——而是你应该select from table

同时,您的第二个查询的“正确”版本应如下所示,因此它不仅可以成功运行具有一个元素的数组,而且可以成功运行多个元素

WITH groc as (
  select ["ram", "abc", "xyz"] as list
) 
SELECT array(select * from UNNEST(list)) list
FROM groc     

在这种情况下,结果是

在此处输入图像描述

仅当您想以某种方式转换原始数组或过滤掉某些元素时,这才有意义-否则它只会返回相同的数组-例如

WITH groc as (
  select ["ram", "abc", "xyz"] as list
) 
SELECT array(select item || "2" from UNNEST(list) item where item != "abc") list
FROM groc

带输出

在此处输入图像描述

在您的第一个查询中,通常您会使用以下模式来展平数组 - 将所有数组的元素提取到单独的行中,如下例所示

WITH groc as (
  select ["ram", "abc", "xyz"] as list
) 
SELECT item || "2" item 
FROM groc,  UNNEST(list) item 
WHERE item != "xyz"    

带输出

在此处输入图像描述

您可以在各自的文档中阅读有关 UNNEST 功能的更多信息


推荐阅读