Moh*_*han 2 sql google-bigquery
在阅读正式语言中的表达式时,我习惯于从内到外阅读,即理解子表达式并构建整体。在这个 SQL 片段中:
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'
Run Code Online (Sandbox Code Playgroud)
一个子表达式是
SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'TITLE'
Run Code Online (Sandbox Code Playgroud)
这不是一个普通的子查询:如果我试图自己运行它,我会得到一个错误,因为event_params它不是一个数组。所以看起来
UNNEST 可以与数组以外的东西一起使用。events_20180725外部使用的表有某种绑定,FROM这使得UNNEST子查询内部可以访问它。https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays包含一些示例(在“查询嵌套数组”下),但实际上并未解释语义。这里发生了什么?
UNNEST 运算符接受一个 ARRAY 并返回一个表,该表中的每个元素对应一行。您还可以在 FROM 子句之外使用 IN 运算符使用 UNNEST。
对于大多数元素类型的输入 ARRAY,UNNEST 的输出一般只有一列。这个单列有一个可选的别名,您可以使用它来引用查询中其他地方的列。具有这些元素类型的 ARRAYS 返回多列:
STRUCT UNNEST 破坏输入 ARRAY 中元素的顺序。使用可选的 WITH OFFSET 子句返回带有数组元素索引的第二列(见下文)。
对于 STRUCT 的输入 ARRAY,UNNEST 为每个 STRUCT 返回一行,对于 STRUCT 中的每个字段都有一个单独的列。每列的别名是对应的 STRUCT 字段的名称。
您可以UNNEST在更适用的部分阅读更多信息- FROM 子句- 去那里向下滚动一点直到 UNNEST 部分