常规函数
至少有*两种类型的函数——常规函数(它们被称为“函数”)和聚合函数。 这些是完全不同的概念。 常规函数的工作方式就好像它们分别应用于每一行一样(对于每一行,函数的结果不依赖于其他行)。 聚合函数累积来自不同行的值集(即它们依赖于整个行集)。
在本节中,我们讨论常规函数。 对于聚合函数,请参见“聚合函数”一节。
‘arrayJoin’ 函数 属于第三种类型的函数。 并且 表函数 也可以单独提及。
强类型
与标准 SQL 相比,ClickHouse 具有强类型。 换句话说,它不会在类型之间进行隐式转换。 每个函数都适用于一组特定的类型。 这意味着有时您需要使用类型转换函数。
公共子表达式消除
查询中所有具有相同 AST(相同的记录或相同的语法解析结果)的表达式都被认为具有相同的值。 此类表达式将被连接并执行一次。 相同的子查询也会以这种方式消除。
结果类型
所有函数都返回单个返回值作为结果(而不是多个值,也不是零个值)。 结果的类型通常仅由参数的类型定义,而不是由值定义。 异常是 tupleElement 函数(a.N 运算符)和 toFixedString 函数。
常量
为简单起见,某些函数只能对某些参数使用常量。 例如,LIKE 运算符的右参数必须是常量。 几乎所有函数都对常量参数返回常量。 异常是生成随机数的函数。 ‘now’ 函数对在不同时间运行的查询返回不同的值,但结果被认为是常量,因为常量性只在单个查询内很重要。 常量表达式也被认为是常量(例如,LIKE 运算符的右侧可以由多个常量构成)。
函数可以针对常量和非常量参数以不同的方式实现(执行不同的代码)。 但是,针对常量和仅包含相同值的真实列的结果应该相互匹配。
NULL 处理
函数具有以下行为
- 如果函数的至少一个参数为
NULL
,则函数结果也为NULL
。 - 在每个函数的描述中单独指定的特殊行为。 在 ClickHouse 源代码中,这些函数具有
UseDefaultImplementationForNulls=false
。
常量性
函数不能更改其参数的值——任何更改都作为结果返回。 因此,计算单独函数的结果不依赖于函数在查询中写入的顺序。
高阶函数、->
运算符和 lambda(params, expr) 函数
高阶函数只能接受 lambda 函数作为其函数参数。 要将 lambda 函数传递给高阶函数,请使用 ->
运算符。 箭头左侧有一个形式参数,可以是任何 ID,也可以是多个形式参数——元组中的任何 ID。 箭头右侧有一个表达式,可以利用这些形式参数,以及任何表列。
例子
x -> 2 * x
str -> str != Referer
可以将接受多个参数的 lambda 函数传递给高阶函数。 在这种情况下,将传递几个长度相同的数组给高阶函数,这些参数将与这些数组相对应。
对于某些函数,可以省略第一个参数(lambda 函数)。 在这种情况下,假定相同的映射。
用户定义函数 (UDF)
ClickHouse 支持用户定义函数。 请参见 UDF。