Операторы
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, например:
Оператор <=> – NULL‑безопасный оператор равенства, эквивалентный IS NOT DISTINCT FROM.
Он работает как обычный оператор равенства (=), но рассматривает значения NULL как сравнимые.
Два значения NULL считаются равными, а сравнение NULL с любым отличным от NULL значением возвращает 0 (ложь), а не NULL.
Операторы для работы с наборами данных
См. операторы 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 указывает дату или время для обработки. Поддерживаются типы Date и DateTime.
Примеры:
В следующем примере создается таблица, и в неё вставляется значение типа DateTime.
Дополнительные примеры можно найти в tests.
INTERVAL
Создаёт значение типа Interval, которое следует использовать в арифметических операциях со значениями типов Date и DateTime.
Типы интервалов:
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
Вы также можете использовать строковый литерал при задании значения INTERVAL. Например, INTERVAL 1 HOUR эквивалентно INTERVAL '1 hour' или INTERVAL '1' hour.
:::tip
Интервалы разных типов нельзя комбинировать. Нельзя использовать выражения вида INTERVAL 4 DAY 1 HOUR. Задавайте интервалы в единицах, которые меньше или равны наименьшей единице интервала, например INTERVAL 25 HOUR. Можно использовать последовательные операции, как показано в примере ниже.
:::
Примеры:
:::note
Синтаксис INTERVAL или функция addDays всегда предпочтительнее. Простое сложение или вычитание (синтаксис вроде now() + ...) не учитывает настройки времени, например, перехода на летнее время.
:::
Примеры:
См. также
- 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.
Условное выражение
Если параметр 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.
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.