Перейти к основному содержимому
Перейти к основному содержимому

Nullable(T)

Позволяет хранить специальный маркер (NULL), который обозначает "пропущенное значение", наряду с обычными значениями, разрешенными типом T. Например, колонка типа Nullable(Int8) может хранить значения типа Int8, а строки, не имеющие значения, будут хранить NULL.

T не может быть любым из составных типов данных Array, Map и Tuple, но составные типы данных могут содержать значения типа Nullable, например, Array(Nullable(Int8)).

Поле типа Nullable не может быть включено в индексы таблицы.

NULL является значением по умолчанию для любого типа Nullable, если иное не указано в конфигурации сервера ClickHouse.

Storage Features

Для хранения значений типа Nullable в столбце таблицы ClickHouse использует отдельный файл с масками NULL в дополнение к обычному файлу со значениями. Записи в файле масок позволяют ClickHouse различать NULL и значение по умолчанию соответствующего типа данных для каждой строки таблицы. Из-за дополнительного файла колонка Nullable потребляет дополнительное место для хранения по сравнению с аналогичной обычной.

примечание

Использование Nullable почти всегда негативно сказывается на производительности, имейте это в виду при проектировании ваших баз данных.

Finding NULL

Можно найти значения NULL в колонке, используя подколонку null, не считывая всю колонку. Она возвращает 1, если соответствующее значение равно NULL, и 0 в противном случае.

Пример

Запрос:

CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);

SELECT n.null FROM nullable;

Результат:

┌─n.null─┐
│      0 │
│      1 │
│      0 │
│      1 │
└────────┘

Usage Example

CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
INSERT INTO t_null VALUES (1, NULL), (2, 3)
SELECT x + y FROM t_null
┌─plus(x, y)─┐
│       ᴺᵁᴸᴸ │
│          5 │
└────────────┘