2020-03-20 18:20:59 +00:00
# Условные функции {#uslovnye-funktsii}
2017-03-12 17:58:51 +00:00
2019-11-12 20:49:04 +00:00
## if {#if}
2018-07-26 14:41:59 +00:00
2020-02-02 22:08:48 +00:00
Условное выражение. В отличии от большинства систем, ClickHouse всегда считает о б а выражения `then` и `else` .
2018-07-26 14:41:59 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-11-12 20:49:04 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-12 20:49:04 +00:00
SELECT if(cond, then, else)
```
2020-02-02 22:08:48 +00:00
Если условие `cond` не равно нулю, то возвращается результат выражения `then` . Если условие `cond` равно нулю или является NULL, то результат выражения `then` пропускается и возвращается результат выражения `else` .
2019-11-12 20:49:04 +00:00
**Параметры**
2020-04-09 18:06:07 +00:00
- `cond` – Условие, которое может быть равно 0 или нет. Может быть [UInt8 ](../../sql_reference/functions/conditional_functions.md ) или `NULL` .
2020-03-21 04:11:51 +00:00
- `then` - Возвращается результат выражения, если условие `cond` истинно.
- `else` - Возвращается результат выражения, если условие `cond` ложно.
2019-11-12 20:49:04 +00:00
**Возвращаемые значения**
Функция выполняет выражения `then` или `else` и возвращает е г о результат, в зависимости от того, было ли условие `cond` равно нулю или нет.
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-11-12 20:49:04 +00:00
SELECT if(1, plus(2, 2), plus(2, 6))
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-11-12 20:49:04 +00:00
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
```
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-11-12 20:49:04 +00:00
SELECT if(0, plus(2, 2), plus(2, 6))
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-11-12 20:49:04 +00:00
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
```
2018-07-26 14:41:59 +00:00
2020-03-17 15:24:11 +00:00
## Тернарный оператор {#ternary-operator}
Работает так же, как функция `if` .
Синтаксис: `cond ? then : else`
Возвращает `then` , если `cond` верно (больше нуля), в остальных случаях возвращает `else` .
2020-03-21 04:11:51 +00:00
- `cond` должно быть типа `UInt8` , `then` и `else` должны относиться к наименьшему общему типу.
2020-03-17 15:24:11 +00:00
2020-03-21 04:11:51 +00:00
- `then` и `else` могут быть `NULL` .
2020-03-17 15:24:11 +00:00
**Смотрите также**
2020-03-21 04:11:51 +00:00
- [ifNotFinite ](other_functions.md#ifnotfinite ).
2020-03-17 15:24:11 +00:00
2020-03-20 18:20:59 +00:00
## multiIf {#multiif}
2018-07-26 14:41:59 +00:00
2018-08-10 14:44:49 +00:00
Позволяет более компактно записать оператор [CASE ](../operators.md#operator_case ) в запросе.
2018-07-26 14:41:59 +00:00
2020-03-21 04:11:51 +00:00
multiIf(cond_1, then_1, cond_2, then_2...else)
2018-07-26 14:41:59 +00:00
**Параметры**
2020-03-21 04:11:51 +00:00
- `cond_N` — Условие, при выполнении которого функция вернёт `then_N` .
- `then_N` — Результат функции при выполнении.
- `else` — Результат функции, если ни одно из условий не выполнено.
2018-07-26 14:41:59 +00:00
Функция принимает `2N+1` параметров.
**Возвращаемые значения**
Функция возвращает одно из значений `then_N` или `else` , в зависимости от условий `cond_N` .
**Пример**
Рассмотрим таблицу
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴──────┘
```
Выполним запрос `SELECT multiIf(isNull(y), x, y < 3, y, NULL) FROM t_null` . Результат:
2020-03-20 18:20:59 +00:00
``` text
2018-07-26 14:41:59 +00:00
┌─multiIf(isNull(y), x, less(y, 3), y, NULL)─┐
│ 1 │
│ ᴺᵁᴸᴸ │
└────────────────────────────────────────────┘
```
2018-10-16 10:47:17 +00:00
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/functions/conditional_functions/ ) <!--hide-->