メインコンテンツまでスキップ
メインコンテンツまでスキップ

Variant(T1, T2, ...)

Beta feature. Learn more.

このタイプは他のデータ型のユニオンを表します。タイプ 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 のサブカラムを読み取ることができます。このサブカラムは、T2Nullable 内に配置できる場合は Nullable(T2) の型を持ち、そうでなければ T2 の型を持ちます。このサブカラムは元の Variant カラムと同じサイズで、元の Variant カラムに型 T2 が存在しないすべての行には NULL 値(または T2Nullable 内に配置できない場合は空の値)を含みます。

Variant サブカラムは関数 variantElement(variant_column, type_name) を使用しても読み取ることができます。

例:

各行に保存されているバリアントを知るには、関数 variantType(variant_column) を使用できます。この関数は、各行のバリアント型名を含む Enum を返します(行が NULL の場合は 'None' が返されます)。

例:

Variantカラムと他のカラムの変換

Variant 型のカラムに対して行うことができる4つの変換があります。

文字列カラムからVariantカラムへの変換

String から Variant への変換は、文字列値から Variant 型の値を解析することによって行われます:

通常のカラムからVariantカラムへの変換

通常のカラムを Variant カラムに変換することが可能で、その際、元の型を含む Variant カラムを作成します:

注意:String 型からの変換は常に解析を通じて行われます。もし、String カラムを解析なしに VariantString バリアントに変換したい場合は、次のようにします:

Variantカラムから通常のカラムへの変換

Variant カラムを通常のカラムに変換することも可能です。この場合、すべてのネストされたバリアントが目的の型に変換されます:

Variantから別のVariantへの変換

Variant カラムを別の Variant カラムに変換することも可能ですが、その際に目的の Variant カラムが元の Variant のすべてのネストされた型を含んでいる必要があります:

データからVariant型を読み取る

すべてのテキストフォーマット(TSV、CSV、CustomSeparated、Values、JSONEachRowなど)は、Variant 型の読み取りをサポートしています。データ解析中に ClickHouse は、最も適切なバリアント型に値を挿入しようとします。

例:

Variant型の値を比較する

Variant 型の値は、同じ Variant 型の値のみと比較できます。

Variant(..., T1, ... T2, ...) において、基底型 T1T2 を持つ値 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 型をサポートしています: