# Функции для работы с Nullable-аргументами ## isNull Проверяет является ли аргумент [NULL](../syntax.md#null). ```sql isNull(x) ``` **Параметры** - `x` — значение с не составным типом данных. **Возвращаемое значение** - `1`, если `x` — `NULL`. - `0`, если `x` — не `NULL`. **Пример** Входная таблица ```text ┌─x─┬────y─┐ │ 1 │ ᴺᵁᴸᴸ │ │ 2 │ 3 │ └───┴──────┘ ``` Запрос ```sql SELECT x FROM t_null WHERE isNull(y) ``` ```text ┌─x─┐ │ 1 │ └───┘ ``` ## isNotNull Проверяет не является ли аргумент [NULL](../syntax.md#null). ```sql isNotNull(x) ``` **Параметры** - `x` — значение с не составным типом данных. **Возвращаемое значение** - `0`, если `x` — `NULL`. - `1`, если `x` — не `NULL`. **Пример** Входная таблица ```text ┌─x─┬────y─┐ │ 1 │ ᴺᵁᴸᴸ │ │ 2 │ 3 │ └───┴──────┘ ``` Запрос ```sql SELECT x FROM t_null WHERE isNotNull(y) ``` ```text ┌─x─┐ │ 2 │ └───┘ ``` ## coalesce Последовательно слева-направо проверяет являются ли переданные аргументы `NULL` и возвращает первый не `NULL`. ```sql coalesce(x,...) ``` **Параметры** - Произвольное количество параметров не составного типа. Все параметры должны быть совместимы по типу данных. **Возвращаемые значения** - Первый не `NULL` аргумент. - `NULL`, если все аргументы — `NULL`. **Пример** Рассмотрим адресную книгу, в которой может быть указано несколько способов связи с клиентом. ```text ┌─name─────┬─mail─┬─phone─────┬──icq─┐ │ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │ │ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ └──────────┴──────┴───────────┴──────┘ ``` Поля `mail` и `phone` имеют тип String, а поле `icq` — `UInt32`, его необходимо будет преобразовать в `String`. Получим из адресной книги первый доступный способ связаться с клиентом: ```sql SELECT coalesce(mail, phone, CAST(icq,'Nullable(String)')) FROM aBook ``` ```text ┌─name─────┬─coalesce(mail, phone, CAST(icq, 'Nullable(String)'))─┐ │ client 1 │ 123-45-67 │ │ client 2 │ ᴺᵁᴸᴸ │ └──────────┴──────────────────────────────────────────────────────┘ ``` ## ifNull Возвращает альтернативное значение, если основной аргумент — `NULL`. ```sql ifNull(x,alt) ``` **Параметры** - `x` — значение для проверки на `NULL`, - `alt` — значение, которое функция вернёт, если `x` — `NULL`. **Возвращаемые значения** - Значение `x`, если `x` — не `NULL`. - Значение `alt`, если `x` — `NULL`. **Пример** ```sql SELECT ifNull('a', 'b') ``` ```text ┌─ifNull('a', 'b')─┐ │ a │ └──────────────────┘ ``` ```sql SELECT ifNull(NULL, 'b') ``` ```text ┌─ifNull(NULL, 'b')─┐ │ b │ └───────────────────┘ ``` ## nullIf Возвращает `NULL`, если аргументы равны. ```sql nullIf(x, y) ``` **Параметры** `x`, `y` — значения для сравнивания. Они должны быть совместимых типов, иначе ClickHouse сгенерирует исключение. **Возвращаемые значения** - `NULL`, если аргументы равны. - Значение `x`, если аргументы не равны. **Пример** ```sql SELECT nullIf(1, 1) ``` ```text ┌─nullIf(1, 1)─┐ │ ᴺᵁᴸᴸ │ └──────────────┘ ``` ```sql SELECT nullIf(1, 2) ``` ```text ┌─nullIf(1, 2)─┐ │ 1 │ └──────────────┘ ``` ## assumeNotNull Приводит значение типа [Nullable](../../data_types/nullable.md) к не `Nullable`, если значение не `NULL`. ```sql assumeNotNull(x) ``` **Параметры** - `x` — исходное значение. **Возвращаемые значения** - Исходное значение с не `Nullable` типом, если оно — не `NULL`. - Значение по умолчанию для не `Nullable` типа, если исходное значение — `NULL`. **Пример** Рассмотрим таблицу `t_null`. ```sql SHOW CREATE TABLE t_null ``` ```text ┌─statement─────────────────────────────────────────────────────────────────┐ │ CREATE TABLE default.t_null ( x Int8, y Nullable(Int8)) ENGINE = TinyLog │ └───────────────────────────────────────────────────────────────────────────┘ ``` ```text ┌─x─┬────y─┐ │ 1 │ ᴺᵁᴸᴸ │ │ 2 │ 3 │ └───┴──────┘ ``` Применим функцию `assumeNotNull` к столбцу `y`. ```sql SELECT assumeNotNull(y) FROM t_null ``` ```text ┌─assumeNotNull(y)─┐ │ 0 │ │ 3 │ └──────────────────┘ ``` ```sql SELECT toTypeName(assumeNotNull(y)) FROM t_null ``` ```text ┌─toTypeName(assumeNotNull(y))─┐ │ Int8 │ │ Int8 │ └──────────────────────────────┘ ``` ## toNullable Преобразует тип аргумента к `Nullable`. ```sql toNullable(x) ``` **Параметры** - `x` — значение произвольного не составного типа. **Возвращаемое значение** - Входное значение с типом не `Nullable`. **Пример** ```sql SELECT toTypeName(10) ``` ```text ┌─toTypeName(10)─┐ │ UInt8 │ └────────────────┘ ``` ```sql SELECT toTypeName(toNullable(10)) ``` ```text ┌─toTypeName(toNullable(10))─┐ │ Nullable(UInt8) │ └────────────────────────────┘ ``` [Оригинальная статья](https://clickhouse.yandex/docs/ru/query_language/functions/functions_for_nulls/)