Перейти к основному содержанию
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.

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

функция 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 (false), а не NULL.
SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘

Операторы для работы со строками

OVERLAY

  • OVERLAY(string PLACING replacement FROM offset) - функция overlay(string, replacement, offset).
  • OVERLAY(string PLACING replacement FROM offset FOR length) - функция overlay(string, replacement, offset, length).
  • OVERLAYUTF8(string PLACING replacement FROM offset) - функция overlayUTF8(string, replacement, offset).
  • OVERLAYUTF8(string PLACING replacement FROM offset FOR length) - функция overlayUTF8(string, replacement, offset, length).

Операторы для работы с наборами данных

См. операторы 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:
Query
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
Response
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
Запрос с ANY:
Query
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
Response
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

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

EXTRACT

EXTRACT(part FROM date);
Извлекает части заданной даты. Например, можно получить месяц из даты или секунду из времени. Параметр part указывает, какую часть даты нужно извлечь. Доступны следующие значения:
  • SECOND — Секунда. Возможные значения: 0–59.
  • MINUTE — Минута. Возможные значения: 0–59.
  • HOUR — Час. Возможные значения: 0–23.
  • DAY — День месяца. Возможные значения: 1–31.
  • WEEK — Номер недели по ISO 8601. Возможные значения: 1–53.
  • MONTH — Номер месяца. Возможные значения: 1–12.
  • QUARTER — Квартал. Возможные значения: 1–4.
  • YEAR — Год.
  • EPOCH — Unix-временная метка (секунды с 1970-01-01 00:00:00 UTC). Примечание: для DateTime64 дробная часть секунды отбрасывается.
  • DOW — День недели (совместимо с PostgreSQL). 0 = воскресенье, 6 = суббота.
  • DOY — День года. Возможные значения: 1–366.
  • ISODOW — День недели по ISO. 1 = понедельник, 7 = воскресенье.
  • ISOYEAR — Год нумерации недель по ISO 8601.
  • CENTURY — Век. Например, 2024 год относится к XXI веку.
  • DECADE — Десятилетие (год, делённый на 10). Например, для 2024 года десятилетие равно 202.
  • MILLENNIUM — Тысячелетие. Например, 2024 год относится к III тысячелетию.
Параметр part регистронезависимый. Параметр date задаёт дату или время для обработки. Поддерживаются типы Date, Date32, DateTime и DateTime64. Примеры:
SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
SELECT EXTRACT(EPOCH FROM toDateTime('2024-01-15 12:30:45', 'UTC'));
SELECT EXTRACT(DOW FROM toDate('2024-01-15'));
SELECT EXTRACT(CENTURY FROM toDate('2024-01-01'));
В следующем примере мы создаём таблицу и вставляем в неё значение типа DateTime.
CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
) ENGINE = MergeTree
ORDER BY ();
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.
Интервалы разных типов нельзя комбинировать. Нельзя использовать выражения вида 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 │
└─────────────────────┴─────────────────────┴─────────────────────┘
См. также
  • тип данных Interval
  • функции преобразования типов toInterval

Сложение даты и времени

Значение Date или Date32 можно сложить со значением Time или Time64 с помощью оператора +. В результате получается DateTime или DateTime64, представляющий дату с указанным временем суток. Эта операция коммутативна. Тип результата зависит от типов операндов:
Левый операндПравый операндТип результата
DateTimeDateTime
DateTime64(s)DateTime64(s)
Date32TimeDateTime64(0)
Date32Time64(s)DateTime64(s)
В результате используется часовой пояс сеанса (или часовой пояс сервера по умолчанию, если часовой пояс сеанса не задан). Настройка date_time_overflow_behavior определяет, что произойдет, если результат выйдет за пределы представимого диапазона.
Примеры:
SET use_legacy_to_time = 0;
SELECT toDate('2024-07-15') + toTime('14:30:25') AS dt, toTypeName(dt);
┌──────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25 │ DateTime       │
└─────────────────────┴────────────────┘
SELECT toDate('2024-07-15') + toTime64('14:30:25.123456', 6) AS dt, toTypeName(dt);
┌─────────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25.123456 │ DateTime64(6)  │
└────────────────────────────┴────────────────┘
SELECT toTime64('23:59:59.999', 3) + toDate32('2024-07-15') AS dt, toTypeName(dt);
┌──────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 23:59:59.999 │ DateTime64(3)  │
└─────────────────────────┴────────────────┘

Оператор логического 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). Следующие операторы не имеют приоритета, поскольку это скобки:

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

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

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

(x1, x2, ...) — функция tuple(x2, 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.
Последнее изменение 10 июня 2026 г.