在阅读正式语言中的表达式时,我习惯于从内到外阅读,即理解子表达式并构建整体。在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包含一些示例(在“查询嵌套数组”下),但实际上并未解释语义。这是怎么回事?
答案 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
函数返回给定列引用的关系,该关系将其他列引入子查询的范围,在这种情况下为key
和value
。对于这种标量子查询:
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE')
对key = 'TITLE'
进行过滤会将UNNEST
返回的行仅限制为键具有该值的那一行。