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

Обзор

Прямое использование результатов условных выражений

Условные выражения всегда возвращают 0, 1 или NULL. Поэтому их результаты можно использовать напрямую, например так:

Значения NULL в условных выражениях

Если в условных выражениях участвуют значения NULL, результатом также будет NULL.
Поэтому, если типы — Nullable, запросы следует составлять особенно внимательно. Следующий пример это показывает: он завершается ошибкой, потому что в multiIf не добавлено условие с равенством.

Оператор CASE

Выражение CASE в ClickHouse предоставляет условную логику, аналогичную оператору CASE в SQL. Оно вычисляет условия и возвращает значения на основе первого совпадения. ClickHouse поддерживает две формы CASE:
  1. CASE WHEN ... THEN ... ELSE ... END
    Эта форма обеспечивает максимальную гибкость и внутренне реализована с помощью функции multiIf. Каждое условие вычисляется независимо, а выражения могут включать неконстантные значения.
  1. CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
    Эта более компактная форма оптимизирована для сопоставления с константными значениями и внутри использует caseWithExpression().
Например, следующий вариант является допустимым:
Эта форма также не требует, чтобы возвращаемые выражения были константами.

Ограничения

ClickHouse определяет тип результата выражения CASE (или его внутреннего эквивалента, например multiIf) до вычисления каких-либо условий. Это важно, когда возвращаемые выражения различаются по типу, например используют разные часовые пояса или числовые типы.
  • Тип результата выбирается на основе наибольшего совместимого типа среди всех ветвей.
  • После выбора этого типа все остальные ветви неявно приводятся к нему — даже если их логика никогда не будет выполнена во время исполнения.
  • Для таких типов, как DateTime64, где часовой пояс является частью сигнатуры типа, это может приводить к неожиданному поведению: часовой пояс, встретившийся первым, может использоваться для всех ветвей, даже если в других ветвях указаны другие часовые пояса.
Например, ниже все строки возвращают временную метку в часовом поясе первой совпавшей ветви, то есть Asia/Kolkata
Здесь ClickHouse видит несколько типов возвращаемого значения DateTime64(3, <timezone>). В качестве общего типа он выводит DateTime64(3, 'Asia/Kolkata' — первый встретившийся вариант, неявно приводя к нему другие ветви. Это можно исправить, преобразовав значение в строку, чтобы сохранить нужное форматирование часового пояса:

clamp

Добавленный в: v24.5.0 Ограничивает значение указанными минимальной и максимальной границами. Если значение меньше минимума, возвращает минимум. Если значение больше максимума, возвращает максимум. В противном случае возвращает само значение. Все аргументы должны быть сравнимых типов. Тип результата — наибольший совместимый тип среди всех аргументов. Синтаксис
Аргументы
  • value — Значение, которое нужно привести к диапазону. - min — Нижняя граница. - max — Верхняя граница.
Возвращаемое значение Возвращает значение, приведённое к диапазону [min, max]. Примеры Базовое использование
Query
Response
Значение ниже минимума
Query
Response
Значение превышает максимум
Query
Response

greatest

Добавленный в: v1.1.0 Возвращает наибольшее значение среди аргументов. Аргументы со значением NULL игнорируются.
  • Для массивов возвращает лексикографически наибольший массив.
  • Для типов DateTime тип результата повышается до наиболее широкого типа (например, до DateTime64, если он используется вместе с DateTime32).
Используйте настройку least_greatest_legacy_null_behavior, чтобы изменить поведение NULLВ версии 24.12 было внесено несовместимое с предыдущими версиями изменение: значения NULL игнорируются, тогда как ранее функция возвращала NULL, если один из аргументов был NULL. Чтобы сохранить прежнее поведение, установите для настройки least_greatest_legacy_null_behavior (по умолчанию: false) значение true.
Синтаксис
Аргументы
  • x1[, x2, ...] — Одно или несколько значений для сравнения. Все аргументы должны быть сравнимых типов. Any
Возвращаемое значение Возвращает наибольшее значение среди аргументов; результат приводится к наибольшему совместимому типу. Any Примеры Числовые типы
Query
Response
Массивы
Query
Response
Типы DateTime
Query
Response

if

Добавленный в: v1.1.0 Выполняет условное ветвление.
  • Если условие cond вычисляется в ненулевое значение, функция возвращает результат выражения then.
  • Если cond вычисляется в ноль или NULL, возвращается результат выражения else.
Параметр short_circuit_function_evaluation определяет, используется ли укороченное вычисление. Если он включен, выражение then вычисляется только для строк, где cond истинно, а выражение else — только там, где cond ложно. Например, при укороченном вычислении исключение деления на ноль не генерируется при выполнении следующего запроса:
then и else должны быть одного или близкого типа. Синтаксис
Аргументы
  • cond — Проверяемое условие. UInt8 или Nullable(UInt8) или NULL
  • then — Выражение, возвращаемое, если cond равно true. - else — Выражение, возвращаемое, если cond равно false или NULL.
Возвращаемое значение Результат одного из выражений then или else в зависимости от условия cond. Примеры Пример использования
Query
Response

least

Добавленный в: v1.1.0 Возвращает наименьшее значение среди аргументов. Аргументы NULL игнорируются.
  • Для массивов возвращает лексикографически наименьший массив.
  • Для типов DateTime тип результата повышается до наибольшего типа (например, DateTime64, если он используется вместе с DateTime32).
Используйте настройку least_greatest_legacy_null_behavior, чтобы изменить поведение NULLВ версии 24.12 было внесено несовместимое с предыдущим поведением изменение: значения NULL теперь игнорируются, тогда как раньше функция возвращала NULL, если один из аргументов был NULL. Чтобы сохранить прежнее поведение, установите для настройки least_greatest_legacy_null_behavior (по умолчанию: false) значение true.
Синтаксис
Аргументы
  • x1[, x2, ...] — Одно или несколько значений для сравнения. Все аргументы должны быть сравнимых типов. Any
Возвращаемое значение Возвращает наименьшее значение среди аргументов, приведённое к наибольшему совместимому типу. Any Примеры Числовые типы
Query
Response
Массивы
Query
Response
Типы DateTime
Query
Response

multiIf

Добавленный в: v1.1.0 Позволяет более компактно записывать оператор CASE в запросе. Вычисляет каждое условие по порядку. Для первого условия, которое истинно (ненулевое и не NULL), возвращает значение соответствующей ветви. Если ни одно из условий не истинно, возвращает значение else. Параметр short_circuit_function_evaluation определяет, используется ли укороченное вычисление. Если оно включено, выражение then_i вычисляется только для строк, где ((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i) истинно. Например, при укороченном вычислении исключение деления на ноль не возникает при выполнении следующего запроса:
Все выражения в ветвях и else должны иметь общий супертип. Условия NULL считаются ложными. Синтаксис
Псевдонимы: caseWithoutExpression, caseWithoutExpr Аргументы
  • cond_N — N-е вычисляемое условие, которое определяет, будет ли возвращено then_N. UInt8 или Nullable(UInt8) или NULL
  • then_N — Результат функции, если cond_N имеет значение true. - else — Результат функции, если ни одно из условий не имеет значение true.
Возвращаемое значение Возвращает результат then_N для соответствующего cond_N, в противном случае возвращает значение else. Примеры Пример использования
Query
Response
Последнее изменение 2 июля 2026 г.