Условные функции
if
Условное выражение. В отличие от большинства систем, ClickHouse всегда считает оба выражения 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
равно нулю или нет.
Пример
Запрос:
Результат:
Запрос:
Результат:
Тернарный оператор
Работает так же, как функция if
.
Синтаксис: cond ? then : else
Возвращает then
, если cond
верно (больше нуля), в остальных случаях возвращает else
.
-
cond
должно быть типаUInt8
,then
иelse
должны относиться к наименьшему общему типу. -
then
иelse
могут бытьNULL
.
Смотрите также
multiIf
Позволяет более компактно записать оператор CASE в запросе.
Синтаксис
Чтобы вычислять функцию 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
.
Пример
Рассмотрим таблицу
Выполним запрос SELECT multiIf(isNull(y), x, y < 3, y, NULL) FROM t_null
. Результат: