还有第三种函数类型,‘arrayJoin’ 函数 就属于这一类。此外,表函数 也可以单独列出。
强类型
公共子表达式消除
结果类型
a.N 运算符) 和 toFixedString 函数。
常量
NULL 处理
- 如果函数的至少一个参数为
NULL,则函数结果也为NULL。 - 各函数的描述中会单独说明其特殊行为。在 ClickHouse 源代码中,这些函数的
UseDefaultImplementationForNulls=false。
不变性
高阶函数
-> 操作符与 lambda(params, expr) 函数
-> 操作符。箭头左侧是形式参数,可以是任意 ID;也可以是多个形式参数,即 Tuple 中的任意多个 ID。箭头右侧是一个表达式,它既可以使用这些形式参数,也可以使用表中的任意列。
示例:
将函数名直接用作 lambda
arrayMap(plus, ...) 使用 2 元,因为 plus 接受两个参数,因此它也适用于元组输入,例如 arrayMap(plus, [(1, 10), (2, 20)]),其中元组元素会被解包为 lambda 的参数。
对于可变参数的内部函数 (例如 concat,它接受任意数量的参数) ,lambda 的元数会退回到数组参数的数量。这对于 arrayMap、arrayFilter 和 arrayFold 这类高阶函数是正确的。对于除数组之外还接受固定非数组参数的高阶函数——例如 arrayPartialSort(f, limit, arr)——直接使用可变参数函数名可能会得到错误的元数,此时需要显式 lambda。
可变参数的内部函数也不会自动解包元组输入。例如,arrayMap(concat, [('a', 'b'), ('c', 'd')]) 会被重写为一元 lambda,因此并不等价于 arrayMap((x, y) -> concat(x, y), [('a', 'b'), ('c', 'd')])。如果希望将元组元素解构后传入可变参数调用,请使用显式 lambda。