2020-04-03 13:23:32 +00:00
---
2022-08-28 14:53:34 +00:00
slug: /en/sql-reference/functions/conditional-functions
2023-04-19 17:05:55 +00:00
sidebar_position: 40
sidebar_label: Conditional
2020-04-03 13:23:32 +00:00
---
2022-06-02 10:55:18 +00:00
# Conditional Functions
2017-12-28 15:13:23 +00:00
2022-06-02 10:55:18 +00:00
## if
2017-12-28 15:13:23 +00:00
2023-04-20 10:18:46 +00:00
Performs conditional branching.
If the condition `cond` evaluates to a non-zero value, the function returns the result of the expression `then` . If `cond` evaluates to zero or `NULL` , then the result of the `else` expression is returned.
Setting [short_circuit_function_evaluation ](../../operations/settings/settings.md#short-circuit-function-evaluation ) controls whether short-circuit evaluation is used. If enabled, the `then` expression is evaluated only on rows where `cond` is `true` and the `else` expression where `cond` is `false` . For example, with short-circuit evaluation, no division-by-zero exception is thrown when executing the query `SELECT if(number = 0, 0, intDiv(42, number)) FROM numbers(10)` .
`then` and `else` must be of a similar type.
2017-12-28 15:13:23 +00:00
2020-02-02 22:06:53 +00:00
**Syntax**
2019-11-12 20:49:04 +00:00
2020-03-20 10:10:48 +00:00
``` sql
2021-09-15 19:15:52 +00:00
if(cond, then, else)
2019-11-12 20:49:04 +00:00
```
2023-04-20 10:18:46 +00:00
Alias: `cond ? then : else` (ternary operator)
2021-09-12 14:36:04 +00:00
2021-02-15 21:22:10 +00:00
**Arguments**
2019-11-12 20:49:04 +00:00
2023-04-20 10:18:46 +00:00
- `cond` – The evaluated condition. UInt8, Nullable(UInt8) or NULL.
- `then` – The expression returned if `condition` is true.
- `else` – The expression returned if `condition` is `false` or NULL.
2019-11-12 20:49:04 +00:00
**Returned values**
2023-04-20 10:18:46 +00:00
The result of either the `then` and `else` expressions, depending on condition `cond` .
2019-11-12 20:49:04 +00:00
**Example**
2020-03-20 10:10:48 +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
```
Result:
2020-03-20 10:10:48 +00:00
``` text
2019-11-12 20:49:04 +00:00
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
```
2022-06-02 10:55:18 +00:00
## multiIf
2020-01-01 16:43:17 +00:00
2023-04-20 10:18:46 +00:00
Allows to write the [CASE ](../../sql-reference/operators/index.md#operator_case ) operator more compactly in the query.
2020-01-01 16:43:17 +00:00
2021-09-12 14:36:04 +00:00
**Syntax**
2018-09-04 11:18:59 +00:00
2021-09-12 14:36:04 +00:00
``` sql
2021-09-15 19:15:52 +00:00
multiIf(cond_1, then_1, cond_2, then_2, ..., else)
2021-09-12 14:36:04 +00:00
```
2023-04-20 10:18:46 +00:00
Setting [short_circuit_function_evaluation ](../../operations/settings/settings.md#short-circuit-function-evaluation ) controls whether short-circuit evaluation is used. If enabled, the `then_i` expression is evaluated only on rows where `((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}) AND cond_i)` is `true` , `cond_i` will be evaluated only on rows where `((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}))` is `true` . For example, with short-circuit evaluation, no division-by-zero exception is thrown when executing the query `SELECT multiIf(number = 2, intDiv(1, number), number = 5) FROM numbers(10)` .
2021-09-12 14:36:04 +00:00
**Arguments**
2018-09-04 11:18:59 +00:00
2023-04-20 10:18:46 +00:00
The function accepts `2N+1` parameters:
- `cond_N` — The N-th evaluated condition which controls if `then_N` is returned.
- `then_N` — The result of the function when `cond_N` is true.
- `else` — The result of the function if none of conditions is true.
2018-09-04 11:18:59 +00:00
**Returned values**
2023-04-20 10:18:46 +00:00
The result of either any of the `then_N` or `else` expressions, depending on the conditions `cond_N` .
2018-09-04 11:18:59 +00:00
**Example**
2023-04-20 10:18:46 +00:00
Assuming this table:
``` text
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
```
2018-09-04 11:18:59 +00:00
2020-03-20 10:10:48 +00:00
``` sql
2020-01-01 16:43:17 +00:00
SELECT
left,
right,
multiIf(left < right , ' left is smaller ' , left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result
FROM LEFT_RIGHT
┌─left─┬─right─┬─result──────────┐
│ ᴺᵁᴸᴸ │ 4 │ Null value │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ left is greater │
│ 4 │ ᴺᵁᴸᴸ │ Null value │
└──────┴───────┴─────────────────┘
2018-09-04 11:18:59 +00:00
```
2020-03-20 10:10:48 +00:00
2022-06-02 10:55:18 +00:00
## Using Conditional Results Directly
2018-09-04 11:18:59 +00:00
2020-01-01 16:43:17 +00:00
Conditionals always result to `0` , `1` or `NULL` . So you can use conditional results directly like this:
2018-09-04 11:18:59 +00:00
2020-03-20 10:10:48 +00:00
``` sql
2020-01-01 16:43:17 +00:00
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
```
2022-06-02 10:55:18 +00:00
## NULL Values in Conditionals
2020-01-01 16:43:17 +00:00
When `NULL` values are involved in conditionals, the result will also be `NULL` .
2018-09-04 11:18:59 +00:00
2020-03-20 10:10:48 +00:00
``` sql
2020-01-01 16:43:17 +00:00
SELECT
NULL < 1 ,
2 < NULL ,
NULL < NULL ,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
2018-09-04 11:18:59 +00:00
```
2020-01-01 16:43:17 +00:00
So you should construct your queries carefully if the types are `Nullable` .
The following example demonstrates this by failing to add equals condition to `multiIf` .
2018-09-04 11:18:59 +00:00
2020-03-20 10:10:48 +00:00
``` sql
2020-01-01 16:43:17 +00:00
SELECT
left,
right,
multiIf(left < right , ' left is smaller ' , left > right, 'right is smaller', 'Both equal') AS faulty_result
FROM LEFT_RIGHT
┌─left─┬─right─┬─faulty_result────┐
│ ᴺᵁᴸᴸ │ 4 │ Both equal │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ right is smaller │
│ 4 │ ᴺᵁᴸᴸ │ Both equal │
└──────┴───────┴──────────────────┘
2018-09-04 11:18:59 +00:00
```
2023-05-23 19:09:54 +00:00
## greatest
Returns the greatest across a list of values. All of the list members must be of comparable types.
Examples:
```sql
SELECT greatest(1, 2, toUInt8(3), 3.) result, toTypeName(result) type;
```
```response
┌─result─┬─type────┐
│ 3 │ Float64 │
└────────┴─────────┘
```
:::note
The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
:::
```sql
SELECT greatest(['hello'], ['there'], ['world'])
```
```response
┌─greatest(['hello'], ['there'], ['world'])─┐
│ ['world'] │
└───────────────────────────────────────────┘
```
```sql
SELECT greatest(toDateTime32(now() + toIntervalDay(1)), toDateTime64(now(), 3))
```
```response
┌─greatest(toDateTime32(plus(now(), toIntervalDay(1))), toDateTime64(now(), 3))─┐
│ 2023-05-12 01:16:59.000 │
└──---──────────────────────────────────────────────────────────────────────────┘
```
:::note
The type returned is a DateTime64 as the DataTime32 must be promoted to 64 bit for the comparison.
:::
## least
Returns the least across a list of values. All of the list members must be of comparable types.
Examples:
```sql
SELECT least(1, 2, toUInt8(3), 3.) result, toTypeName(result) type;
```
```response
┌─result─┬─type────┐
│ 1 │ Float64 │
└────────┴─────────┘
```
:::note
The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
:::
```sql
SELECT least(['hello'], ['there'], ['world'])
```
```response
┌─least(['hello'], ['there'], ['world'])─┐
│ ['hello'] │
└────────────────────────────────────────┘
```
```sql
SELECT least(toDateTime32(now() + toIntervalDay(1)), toDateTime64(now(), 3))
```
```response
┌─least(toDateTime32(plus(now(), toIntervalDay(1))), toDateTime64(now(), 3))─┐
│ 2023-05-12 01:16:59.000 │
└────────────────────────────────────────────────────────────────────────────┘
```
:::note
The type returned is a DateTime64 as the DataTime32 must be promoted to 64 bit for the comparison.
:::