ARRAY JOIN子句
对于包含数组列的表来说是一种常见的操作,用于生成一个新表,该表具有包含该初始列中的每个单独数组元素的列,而其他列的值将被重复显示。 这是 ARRAY JOIN
语句最基本的场景。
它可以被视为执行 JOIN
并具有数组或嵌套数据结构。 类似于 arrayJoin 功能,但该子句功能更广泛。
语法:
您只能在 SELECT
查询指定一个 ARRAY JOIN
。
ARRAY JOIN
支持的类型有:
ARRAY JOIN
- 一般情况下,空数组不包括在结果中JOIN
.LEFT ARRAY JOIN
- 的结果JOIN
包含具有空数组的行。 空数组的值设置为数组元素类型的默认值(通常为0、空字符串或NULL)。
基本 ARRAY JOIN 示例
下面的例子展示 ARRAY JOIN
和 LEFT ARRAY JOIN
的用法,让我们创建一个表包含一个 Array 的列并插入值:
下面的例子使用 ARRAY JOIN
子句:
下一个示例使用 LEFT ARRAY JOIN
子句:
使用别名
在使用ARRAY JOIN
时可以为数组指定别名,数组元素可以通过此别名访问,但数组本身则通过原始名称访问。 示例:
可以使用别名与外部数组执行 ARRAY JOIN
。 例如:
在 ARRAY JOIN
中,多个数组可以用逗号分隔, 在这例子中 JOIN
与它们同时执行(直接sum,而不是笛卡尔积)。 请注意,所有数组必须具有相同的大小。 示例:
下面的例子使用 arrayEnumerate 功能:
具有嵌套数据结构的数组连接
ARRAY JOIN
也适用于 嵌套数据结构:
当指定嵌套数据结构的名称 ARRAY JOIN
,意思是一样的 ARRAY JOIN
它包含的所有数组元素。 下面列出了示例:
这种变化也是有道理的:
可以将别名用于嵌套数据结构,以便选择 JOIN
结果或源数组。 例如:
使用功能 arrayEnumerate 的例子:
实现细节
运行时优化查询执行顺序 ARRAY JOIN
. 虽然 ARRAY JOIN
必须始终之前指定 WHERE/PREWHERE 子句中的查询,从技术上讲,它们可以以任何顺序执行,除非结果 ARRAY JOIN
用于过滤。 处理顺序由查询优化器控制。