跳到主要内容
跳到主要内容

操作符

ClickHouse 在查询解析阶段根据操作符的优先级、优先顺序和结合性将其转换为相应的函数。

访问操作符

a[N] – 访问数组的一个元素。arrayElement(a, N) 函数。

a.N – 访问元组元素。tupleElement(a, N) 函数。

数字否定操作符

-anegate(a) 函数。

对于元组否定: tupleNegate

乘法和除法操作符

a * bmultiply(a, b) 函数。

对于用数值乘以元组:tupleMultiplyByNumber,对于标量积:dotProduct

a / bdivide(a, b) 函数。

对于用数值除以元组:tupleDivideByNumber

a % bmodulo(a, b) 函数。

加法和减法操作符

a + bplus(a, b) 函数。

对于元组加法:tuplePlus

a - bminus(a, b) 函数。

对于元组减法:tupleMinus

比较操作符

equals 函数

a = bequals(a, b) 函数。

a == bequals(a, b) 函数。

notEquals 函数

a != bnotEquals(a, b) 函数。

a <> bnotEquals(a, b) 函数。

lessOrEquals 函数

a <= blessOrEquals(a, b) 函数。

greaterOrEquals 函数

a >= bgreaterOrEquals(a, b) 函数。

less 函数

a < bless(a, b) 函数。

greater 函数

a > bgreater(a, b) 函数。

like 函数

a LIKE slike(a, b) 函数。

notLike 函数

a NOT LIKE snotLike(a, b) 函数。

ilike 函数

a ILIKE silike(a, b) 函数。

BETWEEN 函数

a BETWEEN b AND c – 同于 a >= b AND a <= c

a NOT BETWEEN b AND c – 同于 a < b OR a > c

用于处理数据集的操作符

请参见 IN 操作符EXISTS 操作符。

in 函数

a IN ...in(a, b) 函数。

notIn 函数

a NOT IN ...notIn(a, b) 函数。

globalIn 函数

a GLOBAL IN ...globalIn(a, b) 函数。

globalNotIn 函数

a GLOBAL NOT IN ...globalNotIn(a, b) 函数。

in 子查询函数

a = ANY (subquery)in(a, subquery) 函数。

notIn 子查询函数

a != ANY (subquery) – 同于 a NOT IN (SELECT singleValueOrNull(*) FROM subquery)

in 子查询函数

a = ALL (subquery) – 同于 a IN (SELECT singleValueOrNull(*) FROM subquery)

notIn 子查询函数

a != ALL (subquery)notIn(a, subquery) 函数。

示例

使用 ALL 的查询:

结果:

使用 ANY 的查询:

结果:

用于处理日期和时间的操作符

EXTRACT

从给定日期提取部分。例如,您可以从给定日期检索一个月份,或从时间中检索一个秒数。

part 参数指定要检索日期的哪个部分。可用的值如下:

  • DAY — 月中的天。可能的值:1–31。
  • MONTH — 月份的编号。可能的值:1–12。
  • YEAR — 年份。
  • SECOND — 秒。可能的值:0–59。
  • MINUTE — 分钟。可能的值:0–59。
  • HOUR — 小时。可能的值:0–23。

part 参数不区分大小写。

date 参数指定要处理的日期或时间。支持 DateDateTime 类型。

示例:

在以下示例中,我们创建一个表并插入一个 DateTime 类型的值。

您可以在 tests 中看到更多示例。

INTERVAL

创建一个应在与 DateDateTime 类型值进行算术操作时使用的 Interval 类型值。

间隔类型:

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

在设置 INTERVAL 值时,您也可以使用字符串文字。例如,INTERVAL 1 HOUR 等同于 INTERVAL '1 hour'INTERVAL '1' hour

提示

不同类型的间隔不能组合。您不能使用 INTERVAL 4 DAY 1 HOUR 这样的表达式。请指定小于或等于间隔的最小单位的间隔,例如,INTERVAL 25 HOUR。您可以使用连续的操作,如以下示例所示。

示例:

备注

INTERVAL 语法或 addDays 函数始终是首选。简单的加法或减法(语法如 now() + ...)不会考虑时间设置。例如,夏令时。

示例:

另见

逻辑与操作符

语法 SELECT a AND b — 用函数 and 计算 ab 的逻辑与。

逻辑或操作符

语法 SELECT a OR b — 用函数 or 计算 ab 的逻辑或。

逻辑否定操作符

语法 SELECT NOT a — 用函数 not 计算 a 的逻辑否定。

条件操作符

a ? b : cif(a, b, c) 函数。

注意:

条件操作符计算 b 和 c 的值,然后检查条件 a 是否满足,然后返回相应的值。如果 bCarrayJoin() 函数,则每一行将被复制,无论 "a" 条件如何。

条件表达式

如果指定了 x,则使用 transform(x, [a, ...], [b, ...], c) 函数。否则 – multiIf(a, b, ..., c)

如果表达式中没有 ELSE c 子句,则默认值为 NULL

transform 函数不与 NULL 一起使用。

连接操作符

s1 || s2concat(s1, s2) 函数。

Lambda 创建操作符

x -> exprlambda(x, expr) 函数。

以下操作符没有优先级,因为它们是括号:

数组创建操作符

[x1, ...]array(x1, ...) 函数。

元组创建操作符

(x1, x2, ...)tuple(x1, x2, ...) 函数。

结合性

所有二元操作符具有左结合性。例如,1 + 2 + 3 被转换为 plus(plus(1, 2), 3)。 有时这并不像您预期的那样工作。例如,SELECT 4 > 2 > 3 将返回 0。

为了效率,andor 函数接受任意数量的参数。相应的 ANDOR 操作符链被转换为这些函数的单次调用。

检查 NULL

ClickHouse 支持 IS NULLIS NOT NULL 操作符。

IS NULL

  • 对于 Nullable 类型值,IS NULL 操作符返回:
    • 1,如果值为 NULL
    • 否则返回 0
  • 对于其他值,IS NULL 操作符始终返回 0

可以通过启用 optimize_functions_to_subcolumns 设置进行优化。将 optimize_functions_to_subcolumns = 1 时,函数仅读取 null 子列,而不是读取和处理整个列数据。查询 SELECT n IS NULL FROM table 转换为 SELECT n.null FROM TABLE

IS NOT NULL

  • 对于 Nullable 类型值,IS NOT NULL 操作符返回:
    • 0,如果值为 NULL
    • 否则返回 1
  • 对于其他值,IS NOT NULL 操作符始终返回 1

可以通过启用 optimize_functions_to_subcolumns 设置进行优化。将 optimize_functions_to_subcolumns = 1 时,函数仅读取 null 子列,而不是读取和处理整个列数据。查询 SELECT n IS NOT NULL FROM table 转换为 SELECT NOT n.null FROM TABLE