跳至主要内容
跳至主要内容

常规函数

至少* 有两种类型的函数——常规函数(直接称为“函数”)和聚合函数。这两种概念完全不同。常规函数就像应用于每一行一样(对于每一行,函数的结果不依赖于其他行)。聚合函数则累积来自不同行的值集合(即,它们依赖于整个行集)。

本节讨论常规函数。有关聚合函数,请参阅“聚合函数”一节。

注意

第三种函数类型是 '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

    © . This site is unofficial and not affiliated with ClickHouse, Inc.