跳到主要内容
跳到主要内容
编辑此页

常用函数

至少有*两种类型的函数 - 常用函数(通常就称为“函数”)和聚合函数。这些是完全不同的概念。常用函数的工作方式就像它们分别应用于每一行一样(对于每一行,函数的结果不依赖于其他行)。聚合函数从不同的行累积一组值(即,它们依赖于整组行)。

在本节中,我们讨论常用函数。对于聚合函数,请参阅“聚合函数”部分。

注意

还有第三种类型的函数,“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