跳至主要内容

Nullable(T)

允许存储特殊标记(NULL),它表示“缺失值”,以及由T允许的正常值。例如,一个Nullable(Int8)类型的列可以存储Int8类型的值,并且没有值的行的值会存储为NULL

T不能是任何复合数据类型,例如ArrayMapTuple,但复合数据类型可以包含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 │
└────────────┘