Nullable(T)
T が許可する通常の値に加えて、特別なマーカー (NULL) を格納できるようにします。これは「欠損値」を示します。例えば、Nullable(Int8) 型のカラムは Int8 型の値を格納することができ、値を持たない行は NULL を格納します。
T は、Array、Map、Tuple の複合データ型であってはならないが、複合データ型には Nullable 型の値を含めることができます。例えば Array(Nullable(Int8)) です。
Nullable 型のフィールドは、テーブルのインデックスに含めることはできません。
NULL は、ClickHouse サーバーの設定で別途指定されない限り、どの Nullable 型においてもデフォルトの値です。
ストレージの特性
ClickHouse は、テーブルのカラムに Nullable 型の値を格納するために、通常の値を格納するファイルに加えて NULL マスクのための別のファイルを使用します。マスクファイルのエントリにより、ClickHouse は各テーブル行の対応するデータ型のデフォルト値と NULL を区別することができます。この追加ファイルのため、Nullable カラムは類似の通常のカラムに比べて追加のストレージスペースを消費します。
Note
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 │
└────────────┘