Обзор
Прямое использование результатов условных выражений
0, 1 или NULL. Поэтому их результаты можно использовать напрямую, например так:
Значения NULL в условных выражениях
NULL, результатом также будет NULL.
Nullable, запросы следует составлять особенно внимательно.
Следующий пример это показывает: он завершается ошибкой, потому что в multiIf не добавлено условие с равенством.
Оператор CASE
CASE WHEN ... THEN ... ELSE ... END
Эта форма обеспечивает максимальную гибкость и внутренне реализована с помощью функции multiIf. Каждое условие вычисляется независимо, а выражения могут включать неконстантные значения.
CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
Эта более компактная форма оптимизирована для сопоставления с константными значениями и внутри используетcaseWithExpression().
Ограничения
multiIf) до вычисления каких-либо условий. Это важно, когда возвращаемые выражения различаются по типу, например используют разные часовые пояса или числовые типы.
- Тип результата выбирается на основе наибольшего совместимого типа среди всех ветвей.
- После выбора этого типа все остальные ветви неявно приводятся к нему — даже если их логика никогда не будет выполнена во время исполнения.
- Для таких типов, как DateTime64, где часовой пояс является частью сигнатуры типа, это может приводить к неожиданному поведению: часовой пояс, встретившийся первым, может использоваться для всех ветвей, даже если в других ветвях указаны другие часовые пояса.
Asia/Kolkata
DateTime64(3, <timezone>). В качестве общего типа он выводит DateTime64(3, 'Asia/Kolkata' — первый встретившийся вариант, неявно приводя к нему другие ветви.
Это можно исправить, преобразовав значение в строку, чтобы сохранить нужное форматирование часового пояса:
clamp
value— Значение, которое нужно привести к диапазону. -min— Нижняя граница. -max— Верхняя граница.
Query
Response
Query
Response
Query
Response
greatest
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
Query
Response
if
- Если условие
condвычисляется в ненулевое значение, функция возвращает результат выраженияthen. - Если
condвычисляется в ноль или NULL, возвращается результат выраженияelse.
short_circuit_function_evaluation определяет, используется ли укороченное вычисление.
Если он включен, выражение then вычисляется только для строк, где cond истинно, а выражение else — только там, где cond ложно.
Например, при укороченном вычислении исключение деления на ноль не генерируется при выполнении следующего запроса:
then и else должны быть одного или близкого типа.
Синтаксис
cond— Проверяемое условие.UInt8илиNullable(UInt8)илиNULLthen— Выражение, возвращаемое, еслиcondравноtrue. -else— Выражение, возвращаемое, еслиcondравноfalseилиNULL.
then или else в зависимости от условия cond.
Примеры
Пример использования
Query
Response
least
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
Query
Response
multiIf
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имеет значениеtrue. -else— Результат функции, если ни одно из условий не имеет значениеtrue.
then_N для соответствующего cond_N, в противном случае возвращает значение else.
Примеры
Пример использования
Query
Response