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

操作符

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

访问操作符

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

a.N – 访问元组元素。这个对应的函数是 tupleElement(a, N)

数值取负操作符

-a – 这个对应的函数是 negate (a)

对于元组取负: tupleNegate

乘法和除法操作符

a * b – 这个对应的函数是 multiply (a, b)

用于将元组与数字相乘: tupleMultiplyByNumber,用于标量乘积: dotProduct

a / b – 这个对应的函数是 divide(a, b)

用于将元组与数字相除: tupleDivideByNumber

a % b – 这个对应的函数是 modulo(a, b)

加法和减法操作符

a + b – 这个对应的函数是 plus(a, b)

用于元组的加法: tuplePlus

a - b – 这个对应的函数是 minus(a, b)

用于元组的减法: tupleMinus

比较操作符

等于函数

a = b – 这个对应的函数是 equals(a, b)

a == b – 这个对应的函数是 equals(a, b)

不等于函数

a != b – 这个对应的函数是 notEquals(a, b)

a <> b – 这个对应的函数是 notEquals(a, b)

小于或等于函数

a <= b – 这个对应的函数是 lessOrEquals(a, b)

大于或等于函数

a >= b – 这个对应的函数是 greaterOrEquals(a, b)

小于函数

a < b – 这个对应的函数是 less(a, b)

大于函数

a > b – 这个对应的函数是 greater(a, b)

LIKE 函数

a LIKE s – 这个对应的函数是 like(a, b)

NOT LIKE 函数

a NOT LIKE s – 这个对应的函数是 notLike(a, b)

ILIKE 函数

a ILIKE s – 这个对应的函数是 ilike(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)

NOT IN 函数

a NOT IN ... – 这个对应的函数是 notIn(a, b)

GLOBAL IN 函数

a GLOBAL IN ... – 这个对应的函数是 globalIn(a, b)

GLOBAL NOT IN 函数

a GLOBAL NOT IN ... – 这个对应的函数是 globalNotIn(a, b)

IN 子查询函数

a = ANY (subquery) – 这个对应的函数是 in(a, subquery)

NOT IN 子查询函数

a != ANY (subquery) – 与 a NOT IN (SELECT singleValueOrNull(*) FROM subquery) 相同。

IN 子查询函数

a = ALL (subquery) – 与 a IN (SELECT singleValueOrNull(*) FROM subquery) 相同。

NOT IN 子查询函数

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

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

间隔类型:

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

在设置 INTERVAL 值时,您还可以使用字符串文字。例如,INTERVAL 1 HOURINTERVAL '1 hour'INTERVAL '1' hour 是相同的。

提示

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

示例:

备注

总是推荐使用 INTERVAL 语法或 addDays 函数。简单的加法或减法(例如 now() + ...)不考虑时间设置,例如夏令时。

示例:

另请参见

逻辑 AND 操作符

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

逻辑 OR 操作符

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

逻辑取反操作符

语法 SELECT NOT a — 计算 a 的逻辑取反,使用函数 not

条件操作符

a ? b : c – 这个对应的函数是 if(a, b, c)

注意:

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

条件表达式

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

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

transform 函数不适用于 NULL

连接操作符

s1 || s2 – 这个对应的函数是 concat(s1, s2)

Lambda 创建操作符

x -> expr – 这个对应的函数是 lambda(x, expr)

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

数组创建操作符

[x1, ...] – 这个对应的函数是 array(x1, ...)

元组创建操作符

(x1, x2, ...) – 这个对应的函数是 tuple(x2, 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