Условные функции
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 │
│ ᴺᵁᴸᴸ │
└────────────────────────────────────────────┘