Условные функции
Обзор
Использование условных результатов напрямую
Условные функции всегда возвращают 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
Ограничивает значение в пределах указанных минимальных и максимальных границ.
Если значение меньше минимума, возвращает минимум. Если значение больше максимума, возвращает максимум. В противном случае возвращает само значение.
Все аргументы должны быть сопоставимыми типами. Тип результата - это наибольший совместимый тип среди всех аргументов.
Синтаксис
Аргументы
value
— Значение, которое нужно ограничить.min
— Минимальная граница.max
— Максимальная граница.
Возвращаемое значение
Возвращает значение, ограниченное в диапазоне [min, max].
Примеры
Основное использование
Значение ниже минимума
Значение выше максимума
greatest
Представлено в: v1.1
Возвращает наибольшее значение среди аргументов.
Аргументы 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
if
Представлено в: v1.1
Выполняет условное разветвление.
- Если условие
cond
оценивается как ненулевое значение, функция возвращает результат выраженияthen
. - Если
cond
оценивается как ноль или NULL, возвращается результат выраженияelse
.
Настройка short_circuit_function_evaluation
управляет тем, используется ли короткое замыкание.
Если включено, выражение then
оценивается только для строк, где cond
истинно, а выражение else
— где cond
ложно.
Например, при оценке в коротком замыкании никаких исключений деления на ноль не возникает при выполнении следующего запроса:
then
и else
должны быть одного похожего типа.
Синтаксис
Аргументы
cond
— Оцениваемое условие.UInt8
илиNullable(UInt8)
илиNULL
then
— Выражение, возвращаемое еслиcond
истинно.else
— Выражение, возвращаемое еслиcond
ложно илиNULL
.
Возвращаемое значение
Результат либо выражения then
, либо выражения else
, в зависимости от условия cond
.
Примеры
Пример использования
least
Представлено в: v1.1
Возвращает наименьшее значение среди аргументов.
Аргументы 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
Позволяет писать оператор CASE
более компактно в запросе.
Оценивает каждое условие по порядку. Для первого условия, которое истинно (ненулевое и не NULL
), возвращает соответствующее значение ветви.
Если ни одно из условий не истинно, возвращает значение else
.
Настройка short_circuit_function_evaluation
контролирует, используется ли короткое замыкание. Если включено, выражение then_i
оценивается только для строк, где ((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i)
истинно.
Например, при оценке в коротком замыкании никаких исключений деления на ноль не возникает при выполнении следующего запроса:
Все ветвевые и else выражения должны иметь общий супертип. Условия NULL
рассматриваются как ложные.
Синтаксис
Аргументы
cond_N
— N-е оцениваемое условие, которое контролирует, будет ли возвращеноthen_N
.UInt8
илиNullable(UInt8)
илиNULL
then_N
— Результат функции, когдаcond_N
истинно.else
— Результат функции, если ни одно из условий не истинно.
Возвращаемое значение
Возвращает результат then_N
для соответствующего cond_N
, в противном случае возвращает условие else
.
Примеры
Пример использования