Упростил примеры.
5.6 KiB
toc_priority | toc_title |
---|---|
43 | Условные функции |
Условные функции
if
Условное выражение. В отличие от большинства систем, ClickHouse всегда считает оба выражения then
и else
.
Синтаксис
if(cond, then, else)
Если условие cond
не равно нулю, то возвращается результат выражения then
. Если условие cond
равно нулю или является NULL, то результат выражения then
пропускается и возвращается результат выражения else
.
Чтобы вычислять функцию if
по короткой схеме, используйте настройку short_circuit_function_evaluation. Если настройка включена, то выражение then
вычисляется только для строк, где условие cond
верно, а выражение else
– для строк, где условие cond
неверно. Например, при выполнении запроса SELECT if(number = 0, 0, intDiv(42, number)) FROM numbers(10)
не будет сгенерировано исключение из-за деления на ноль, так как intDiv(42, number)
будет вычислено только для чисел, которые не удовлетворяют условию number = 0
.
Аргументы
cond
– проверяемое условие. Может быть UInt8 илиNULL
.then
– возвращается результат выражения, если условиеcond
истинно.else
– возвращается результат выражения, если условиеcond
ложно.
Возвращаемые значения
Функция выполняет выражения then
или else
и возвращает его результат, в зависимости от того, было ли условие cond
равно нулю или нет.
Пример
Запрос:
SELECT if(1, plus(2, 2), plus(2, 6));
Результат:
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
Запрос:
SELECT if(0, plus(2, 2), plus(2, 6));
Результат:
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
Тернарный оператор
Работает так же, как функция if
.
Синтаксис: cond ? then : else
Возвращает then
, если cond
верно (больше нуля), в остальных случаях возвращает else
.
-
cond
должно быть типаUInt8
,then
иelse
должны относиться к наименьшему общему типу. -
then
иelse
могут бытьNULL
.
Смотрите также
multiIf
Позволяет более компактно записать оператор CASE в запросе.
Синтаксис
multiIf(cond_1, then_1, cond_2, then_2, ..., else)
Чтобы вычислять функцию multiIf
по короткой схеме, используйте настройку short_circuit_function_evaluation. Если настройка включена, то выражение then_i
вычисляется только для строк, где условие ((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}) AND cond_i)
верно, cond_i
вычисляется только для строк, где условие ((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}))
верно. Например, при выполнении запроса SELECT multiIf(number = 2, intDiv(1, number), number = 5) FROM numbers(10)
не будет сгенерировано исключение из-за деления на ноль.
Аргументы
cond_N
— условие, при выполнении которого функция вернётthen_N
.then_N
— результат функции при выполнении.else
— результат функции, если ни одно из условий не выполнено.
Функция принимает 2N+1
параметров.
Возвращаемые значения
Функция возвращает одно из значений then_N
или else
, в зависимости от условий cond_N
.
Пример
Рассмотрим таблицу
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴──────┘
Выполним запрос SELECT multiIf(isNull(y), x, y < 3, y, NULL) FROM t_null
. Результат:
┌─multiIf(isNull(y), x, less(y, 3), y, NULL)─┐
│ 1 │
│ ᴺᵁᴸᴸ │
└────────────────────────────────────────────┘