Variant(T1, T2, ...)
このタイプは他のデータ型のユニオンを表します。タイプ Variant(T1, T2, ..., TN)
はこのタイプの各行が、T1
または T2
または ... 或いは TN
のいずれかのタイプの値を持つ、またはそのいずれでもない (NULL
値) ことを意味します。
ネストされた型の順序は重要ではありません: Variant(T1, T2) = Variant(T2, T1)。 ネストされた型は Nullable(...)、LowCardinality(Nullable(...)) および Variant(...) 型を除く任意の型にすることができます。
類似の型をバリアントとして使用することは推奨されません(例えば、Variant(UInt32, Int64)
のような異なる数値型や、Variant(Date, DateTime)
のような異なる日付型)。
これらの型の値を操作することはあいまいさをもたらす可能性があります。デフォルトでは、このような Variant
型を作成することは例外を引き起こしますが、allow_suspicious_variant_types
設定を使用して有効にすることができます。
Variant データ型はベータ機能です。使用するには、enable_variant_type = 1
を設定してください。
Variantの作成
テーブルカラムの定義で Variant
型を使用する:
通常のカラムからのCASTを使用する:
共通型を持たない引数で関数 if/multiIf
を使用する(設定 use_variant_as_common_type
を有効にする必要があります):
配列の要素/マップの値が共通の型を持たない場合に、関数 'array/map' を使用する(設定 use_variant_as_common_type
を有効にする必要があります):
Variant ネスト型をサブカラムとして読み取る
Variant 型は、Variant カラムから単一のネスト型をサブカラムとして読み取ることをサポートしています。したがって、variant Variant(T1, T2, T3)
カラムがある場合、variant.T2
構文を使用して型 T2
のサブカラムを読み取ることができます。このサブカラムは、T2
が Nullable
内に配置できる場合は Nullable(T2)
の型を持ち、そうでなければ T2
の型を持ちます。このサブカラムは元の Variant
カラムと同じサイズで、元の Variant
カラムに型 T2
が存在しないすべての行には NULL
値(または T2
が Nullable
内に配置できない場合は空の値)を含みます。
Variant サブカラムは関数 variantElement(variant_column, type_name)
を使用しても読み取ることができます。
例:
各行に保存されているバリアントを知るには、関数 variantType(variant_column)
を使用できます。この関数は、各行のバリアント型名を含む Enum
を返します(行が NULL
の場合は 'None'
が返されます)。
例:
Variantカラムと他のカラムの変換
Variant
型のカラムに対して行うことができる4つの変換があります。
文字列カラムからVariantカラムへの変換
String
から Variant
への変換は、文字列値から Variant
型の値を解析することによって行われます:
通常のカラムからVariantカラムへの変換
通常のカラムを Variant
カラムに変換することが可能で、その際、元の型を含む Variant
カラムを作成します:
注意:String
型からの変換は常に解析を通じて行われます。もし、String
カラムを解析なしに Variant
の String
バリアントに変換したい場合は、次のようにします:
Variantカラムから通常のカラムへの変換
Variant
カラムを通常のカラムに変換することも可能です。この場合、すべてのネストされたバリアントが目的の型に変換されます:
Variantから別のVariantへの変換
Variant
カラムを別の Variant
カラムに変換することも可能ですが、その際に目的の Variant
カラムが元の Variant
のすべてのネストされた型を含んでいる必要があります:
データからVariant型を読み取る
すべてのテキストフォーマット(TSV、CSV、CustomSeparated、Values、JSONEachRowなど)は、Variant
型の読み取りをサポートしています。データ解析中に ClickHouse は、最も適切なバリアント型に値を挿入しようとします。
例:
Variant型の値を比較する
Variant
型の値は、同じ Variant
型の値のみと比較できます。
型 Variant(..., T1, ... T2, ...)
において、基底型 T1
と T2
を持つ値 v1
および v2
に対する演算子 <
の結果は以下のように定義されます:
T1 = T2 = T
の場合、結果はv1.T < v2.T
(基底値が比較される)。T1 != T2
の場合、結果はT1 < T2
(型名が比較される)。
例:
特定の Variant
値を持つ行を見つける必要がある場合は、次のいずれかを行います。
- 値を対応する
Variant
型にキャストします。
- 必要な型の
Variant
サブカラムと比較します:
時には、Nullable
内に配置できない Array/Map/Tuple
のような複雑な型を持つサブカラムに対して追加の確認を行うことが有用です。異なる型を持つ行には NULL
の代わりにデフォルト値が入るためです:
注意: 異なる数値型のバリアントは異なるバリアントと見なされ、お互いに比較されず、型名が比較されます。
例:
注意 デフォルトでは Variant
型は GROUP BY
/ ORDER BY
キーに使用できません。使用したい場合は、その特別な比較ルールを考慮し、allow_suspicious_types_in_group_by
/ allow_suspicious_types_in_order_by
設定を有効にしてください。
JSONExtract関数とVariant
すべての JSONExtract*
関数は Variant
型をサポートしています: