Условные функции
Обзор
Прямое использование результатов условных выражений
Условные выражения всегда возвращают значение 0, 1 или NULL. Поэтому вы можете напрямую использовать результаты условных выражений, как показано ниже:
Значения NULL в условных выражениях
Когда в условных выражениях участвует NULL, результат также будет NULL.
Поэтому при работе с типами Nullable запросы следует составлять особенно тщательно.
Следующий пример демонстрирует это на ситуации, когда к multiIf не добавлено условие равенства.
Оператор CASE
Выражение CASE в ClickHouse реализует условную логику, аналогичную оператору CASE в SQL. Оно проверяет условия и возвращает значения в зависимости от первого условия, которое оказалось истинным.
ClickHouse поддерживает две формы записи CASE:
CASE WHEN ... THEN ... ELSE ... END
Эта форма предоставляет максимальную гибкость и внутренне реализована с использованием функции multiIf. Каждое условие вычисляется независимо, а выражения могут включать неконстантные значения.
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].
Примеры
Базовое использование
Значение меньше минимального
Значение превышает максимум
greatest
Введена в версии: v1.1.0
Возвращает наибольшее значение среди аргументов.
Аргументы NULL игнорируются.
- Для массивов возвращает лексикографически наибольший массив.
- Для типов
DateTimeтип результата повышается до наибольшего типа (например, доDateTime64, если используется совместно сDateTime32).
least_greatest_legacy_null_behavior для изменения поведения NULLВ версии 24.12 было внесено изменение, несовместимое с предыдущими версиями: значения NULL теперь игнорируются, тогда как ранее функция возвращала NULL, если один из аргументов был NULL.
Чтобы сохранить прежнее поведение, установите SETTING least_greatest_legacy_null_behavior (по умолчанию: false) в значение true.
Синтаксис
Аргументы
x1[, x2, ...]— одно или несколько значений для сравнения. Все аргументы должны быть сравнимых типов.Any
Возвращаемое значение
Возвращает наибольшее значение среди аргументов, приведённое к наибольшему совместимому типу. Any
Примеры
Числовые типы
Массивы
Типы данных DateTime
if
Добавлено в: v1.1.0
Выполняет условное ветвление.
- Если условие
condдаёт ненулевое значение, функция возвращает результат выраженияthen. - Если
condдаёт ноль или NULL, возвращается результат выраженияelse.
Настройка short_circuit_function_evaluation управляет использованием укороченного вычисления.
Если она включена, выражение then вычисляется только для строк, где cond истинно, а выражение else — только для строк, где cond ложно.
Например, при укороченном вычислении исключение деления на ноль не генерируется при выполнении следующего запроса:
then и else должны быть одного типа.
Синтаксис
Аргументы
cond— Оцениваемое условие.UInt8илиNullable(UInt8)илиNULLthen— выражение, возвращаемое, еслиcondистинно. -else— выражение, возвращаемое, еслиcondложно или равноNULL.
Возвращаемое значение
Результат выражения then или else в зависимости от условия cond.
Примеры
Пример использования
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
Примеры
Числовые типы
Массивы
Типы DateTime
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)илиNULLthen_N— результат функции, когдаcond_Nистинно.else— результат функции, если ни одно из условий не истинно.
Возвращаемое значение
Возвращает значение then_N для соответствующего cond_N, в противном случае возвращает значение аргумента else.
Примеры
Пример использования