arrayJoin 函数
这是一个非常特殊的函数。
普通函数不会改变行集合,只是改变每行中的值(映射)。聚合函数压缩一个行集合(折叠或归约)。arrayJoin 函数接收每一行并生成一个行集合(展开)。
此函数将一个数组作为参数,并将源行传播到多个行,行数等于数组中的元素数量。列中的所有值都会被简单复制,除了应用此函数所在的列;它将被相应的数组值替换。
如果数组为空,arrayJoin 不会产生任何行。要返回包含数组类型默认值的单个行,可以将其包装在 emptyArrayToSingle 中,例如:arrayJoin(emptyArrayToSingle(...))。
例如
arrayJoin 函数会影响查询的所有部分,包括 WHERE 部分。请注意,以下查询的结果是 2,即使子查询返回了 1 行。
一个查询可以使用多个 arrayJoin 函数。在这种情况下,转换会多次执行,行数会相乘。例如
最佳实践
由于公共子表达式的消除,使用具有相同表达式的多个 arrayJoin 可能不会产生预期的结果。在这种情况下,请考虑使用额外的操作修改重复的数组表达式,这些操作不会影响连接结果。例如,arrayJoin(arraySort(arr))、arrayJoin(arrayConcat(arr, []))
示例
请注意 SELECT 查询中的 ARRAY JOIN 语法,它提供了更广泛的可能性。ARRAY JOIN 允许您一次转换具有相同数量元素的多个数组。
示例
或者您可以使用 Tuple
示例
ClickHouse 中的 arrayJoin 名称源于其概念上与 JOIN 操作的相似性,但应用于单行内的数组。虽然传统的 JOIN 将来自不同表的行组合在一起,但 arrayJoin “连接”行中的每个数组元素,生成多行 - 每行一个数组元素 - 同时复制其他列的值。ClickHouse 还提供了 ARRAY JOIN 子句语法,这使得与传统 JOIN 操作的关系更加明确,因为它使用了熟悉的 SQL JOIN 术语。此过程也称为“展开”数组,但函数名称和子句中都使用“连接”一词,因为它类似于使用数组元素连接表,有效地以类似于 JOIN 操作的方式扩展数据集。