Nullable(T)
允许存储特殊标记(NULL),它表示“缺失值”,以及由T
允许的正常值。例如,一个Nullable(Int8)
类型的列可以存储Int8
类型的值,并且没有值的行的值会存储为NULL
。
T
不能是任何复合数据类型,例如Array、Map和Tuple,但复合数据类型可以包含Nullable
类型的值,例如Array(Nullable(Int8))
。
Nullable
类型的字段不能包含在表索引中。
NULL
是任何Nullable
类型的默认值,除非在 ClickHouse 服务器配置中另有指定。
存储特性
为了在表列中存储Nullable
类型的值,ClickHouse 除了使用包含值的普通文件外,还会使用一个包含NULL
掩码的单独文件。掩码文件中的条目允许 ClickHouse 区分每个表行的NULL
和相应数据类型的默认值。由于存在附加文件,因此与类似的普通列相比,Nullable
列会消耗额外的存储空间。
注意
使用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 TinyLog
INSERT INTO t_null VALUES (1, NULL), (2, 3)
SELECT x + y FROM t_null
┌─plus(x, y)─┐
│ ᴺᵁᴸᴸ │
│ 5 │
└────────────┘