2020-10-26 10:29:30 +00:00
---
toc_priority: 43
2021-03-08 14:54:44 +00:00
toc_title: "Условные функции"
2020-10-26 10:29:30 +00:00
---
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
2021-08-09 16:52:15 +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
2021-03-13 18:18:45 +00:00
**Аргументы**
2019-11-12 20:49:04 +00:00
2021-03-15 12:54:51 +00:00
- `cond` – проверяемое условие. Может быть [UInt8 ](../../sql-reference/functions/conditional-functions.md ) или `NULL` .
2021-03-13 18:18:45 +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
2021-03-13 18:18:45 +00:00
SELECT if(1, plus(2, 2), plus(2, 6));
2019-11-12 20:49:04 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-11-12 20:49:04 +00:00
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
2021-03-13 18:18:45 +00:00
SELECT if(0, plus(2, 2), plus(2, 6));
2019-11-12 20:49:04 +00:00
```
2021-03-13 18:18:45 +00:00
Результат:
2019-11-12 20:49:04 +00:00
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-04-30 18:19:18 +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
2020-05-15 04:34:54 +00:00
Позволяет более компактно записать оператор [CASE ](../operators/index.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
2021-03-13 18:18:45 +00:00
**Аргументы**
2018-07-26 14:41:59 +00:00
2021-03-13 18:18:45 +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