允许在 T 所允许的正常值之外,存储表示“缺失值”的特殊标记 (NULL) 。例如,Nullable(Int8) 类型的列可以存储 Int8 类型的值,而没有值的行则存储 NULL。
T 不能是以下任一复合数据类型:
不过,复合数据类型可以包含 Nullable 类型的值,例如 Array(Nullable(Int8)) 或 Tuple(Nullable(String), Nullable(Int64))。
Nullable 类型的字段不能包含在表索引中。
除非在 ClickHouse 服务器配置中另有指定,否则 NULL 是所有 Nullable 类型的默认值。
存储特性
要在表的列中存储 Nullable 类型的值,ClickHouse 除了存放值的普通文件外,还会使用一个单独的文件来存储 NULL 掩码。掩码文件中的条目使 ClickHouse 能够区分每个表行中的 NULL 和相应数据类型的默认值。由于多了一个额外文件,Nullable 列相比类似的普通列会占用更多存储空间。
查找 NULL
可以通过 null 子列在无需读取整列的情况下查找列中的 NULL 值。若对应的值为 NULL,则返回 1;否则返回 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 │
└────────┘使用示例
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLogINSERT INTO t_null VALUES (1, NULL), (2, 3)SELECT x + y FROM t_null┌─plus(x, y)─┐
│ ᴺᵁᴸᴸ │
│ 5 │
└────────────┘