SQL'FROM UNNEST'的语义是什么?

时间:2018-10-23 17:09:11

标签: sql google-bigquery

在阅读正式语言中的表达式时,我习惯于从内到外阅读,即理解子表达式并构建整体。在this SQL snippet中:

SELECT 
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE') AS level_id,
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'url') AS url
FROM `events_20180725`
WHERE event_name = 'SCI_ERROR'

一个子表达式是

SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE'

那不是正常的子查询:如果我尝试独自运行它,我会收到一条错误消息,因为event_params不是数组。看来

  • UNNEST可以用于数组以外的其他东西。
  • 外部events_20180725中使用的表FROM有某种绑定,这使得子查询中的UNNEST可以访问它。

https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays包含一些示例(在“查询嵌套数组”下),但实际上并未解释语义。这是怎么回事?

2 个答案:

答案 0 :(得分:3)

  

UNNEST运算符采用一个ARRAY并返回一个表,该表中的每个元素对应一行。您还可以在IN运算符的FROM子句之外使用UNNEST。

     

对于大多数元素类型的输入数组,UNNEST的输出通常只有一列。这单个列具有可选的别名,您可以使用该别名来引用查询中其他位置的列。具有这些元素类型的数组返回多个列:

     

结构   UNNEST破坏输入数组中元素的顺序。使用可选的WITH OFFSET子句返回带有数组元素索引的第二列(见下文)。

     

对于输入的STRUCT数组,UNNEST为每个STRUCT返回一行,并为STRUCT中的每个字段单独列出一列。每列的别名是相应的STRUCT字段的名称。

您可以在更为适用的部分中FROM clause中详细了解UNNEST-转到此处并向下滚动直到UNNEST部分

答案 1 :(得分:2)

events_20180725中选择的外部查询将event_params引入选择列表的范围。将标量子查询放入选择列表时,该子查询可以引用外部作用域中的列。 UNNEST函数返回给定列引用的关系,该关系将其他列引入子查询的范围,在这种情况下为keyvalue。对于这种标量子查询:

(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE')

key = 'TITLE'进行过滤会将UNNEST返回的行仅限制为键具有该值的那一行。