Перейти к основному содержанию
Перейти к основному содержанию

Операторы

ClickHouse преобразует операторы в соответствующие функции на этапе разбора запроса в соответствии с их приоритетом, порядком вычисления и ассоциативностью.

Операторы доступа

a[N] – доступ к элементу массива. Функция arrayElement(a, N).

a.N – доступ к элементу кортежа. Функция tupleElement(a, N).

Оператор числового отрицания

Для отрицания кортежей: 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.

Операторы сравнения

Функция equals

a = b – Функция equals(a, b).

a == b – Функция equals(a, b).

Функция notEquals

a != b – функция notEquals(a, b).

a <> b – функция notEquals(a, b).

Функция lessOrEquals

a <= b – Функция lessOrEquals(a, b).

Функция greaterOrEquals

a >= b – Функция greaterOrEquals(a, b).

Функция less

a < b – Функция less(a, b).

Функция greater

a > b – Функция greater(a, b).

Функция like

a LIKE b – Функция like(a, b).

Функция notLike

a NOT LIKE b – Функция notLike(a, b).

Функция ilike

a ILIKE b – Функция 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.

Оператор is not distinct from (<=>)

Примечание

Начиная с версии 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 (ложь), а не 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 указывает дату или время для обработки. Поддерживаются типы Date и DateTime.

Примеры:

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 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘

Дополнительные примеры можно найти в tests.

INTERVAL

Создаёт значение типа Interval, которое следует использовать в арифметических операциях со значениями типов Date и DateTime.

Типы интервалов:

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

Вы также можете использовать строковый литерал при задании значения INTERVAL. Например, INTERVAL 1 HOUR эквивалентно INTERVAL '1 hour' или INTERVAL '1' hour.

:::tip
Интервалы разных типов нельзя комбинировать. Нельзя использовать выражения вида 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 │
└─────────────────────┴────────────────────────────────────────────────────────────┘

:::note
Синтаксис 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 │
└─────────────────────┴─────────────────────┴─────────────────────┘

См. также

  • Interval — тип данных
  • toInterval — функция преобразования типов

Оператор логического AND

Синтаксис SELECT a AND b — вычисляет логическую конъюнкцию a и b с помощью функции and.

Оператор логического ИЛИ

Синтаксис SELECT a OR b — вычисляет логическую дизъюнкцию a и b с помощью функции or.

Оператор логического отрицания

Синтаксис SELECT NOT a – вычисляет логическое отрицание выражения a с помощью функции not.

Условный оператор

a ? b : c – Функция if(a, b, c).

Примечание:

Условный оператор вычисляет значения b и c, затем проверяет, выполняется ли условие a, и после этого возвращает соответствующее значение. Если b или c является функцией arrayJoin(), каждая строка будет продублирована независимо от условия 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 || s2 – Функция concat(s1, s2).

Оператор создания лямбда-выражения

x -> expr – функция lambda(x, expr).

Следующие операторы не имеют собственного приоритета, так как являются скобками:

Оператор создания массива

[x1, ...] – Функция array(x1, ...).

Оператор создания кортежей

(x1, x2, ...) – Функция tuple(x1, x2, ...).

Оператор создания кортежа

Все бинарные операторы левоассоциативны. Например, 1 + 2 + 3 преобразуется в plus(plus(1, 2), 3). Иногда ведет себя не так, как вы ожидаете. Например, SELECT 4 > 2 > 3 вернет 0.

Для повышения эффективности функции and и or принимают произвольное количество аргументов. Соответствующие цепочки операторов AND и OR преобразуются в один вызов этих функций.

Проверка на NULL

ClickHouse поддерживает операторы IS NULL и IS 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.

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

IS NOT NULL

  • Для значений типа Nullable оператор 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.