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

运算符

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 blike(a, b) 函数。

notLike 函数

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

ilike 函数

a ILIKE bilike(a, b) 函数。

BETWEEN 函数

a BETWEEN b AND c – 与 a >= b AND a <= c 相同。

a NOT BETWEEN b AND c – 与 a < b OR a > c 相同。

不区分的运算符 (<=>)

注意

从 25.10 版本开始,你可以像使用任何其他运算符一样使用 <=>。 在 25.10 之前,它只能在 JOIN 表达式中使用,例如

CREATE TABLE a (x String) ENGINE = Memory;
INSERT INTO a VALUES ('ClickHouse');

SELECT * FROM a AS a1 JOIN a AS a2 ON a1.x <=> a2.x;

┌─x──────────┬─a2.x───────┐
│ ClickHouse │ ClickHouse │
└────────────┴────────────┘

<=> 运算符是 NULL 安全的相等运算符,等效于 IS NOT DISTINCT FROM。 它像常规的相等运算符 (=) 一样工作,但它将 NULL 值视为可比较。 两个 NULL 值被认为是相等的,并且 NULL 与任何非 NULL 值进行比较返回 0 (false) 而不是 NULL

SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘

用于处理数据集的运算符

请参阅 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 的查询

SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));

结果

┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

包含 ANY 的查询

SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));

结果

┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

用于处理日期和时间的运算符

EXTRACT

EXTRACT(part FROM date);

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

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

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

part 参数不区分大小写。

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

示例

SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));

在下面的示例中,我们创建一个表并向其中插入一个具有 DateTime 类型的值。

CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
)
ENGINE = Log;
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘

你可以在 测试 中查看更多示例。

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。 你可以使用连续操作,如下例所示。

示例

SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘
注意

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

示例

SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day;
┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐
│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┘

参见

逻辑与运算符

语法 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" 条件如何,每一行都将被复制。

条件表达式

CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END

如果指定了 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(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

  • 对于 可为空 类型的值,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

SELECT x+100 FROM t_null WHERE y IS NULL
┌─plus(x, 100)─┐
│          101 │
└──────────────┘

IS NOT NULL

  • 对于 可为空 类型的值,IS NOT NULL 运算符返回
    • 0,如果该值为 NULL
    • 1,否则。
  • 对于其他值,IS NOT NULL 运算符始终返回 1
SELECT * FROM t_null WHERE y IS NOT NULL
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘

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

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