メインコンテンツへスキップ
ネストされたデータ構造は、セルの中にあるテーブルのようなものです。ネストされたデータ構造のパラメータ (カラム名と型) は、CREATE TABLE クエリと同じ方法で指定します。テーブルの各行は、ネストされたデータ構造内の任意の数の行に対応できます。
カラム名にはドットを使用しないでくださいドットを含むカラム名、共通のドット付きプレフィックスを持つカラム、Array 型のカラムは、それぞれ flatten_nested = 1 (デフォルト) でフラット化された Nested 構造の一部として解釈される場合があります。これにより、INSERT 時に予期しない配列長の検証や、名前変更の制限が発生することがあります。可能であれば、カラム名にはドットを使用しないでください。 意図的に Nested のセマンティクスが必要な場合を除き、カラム名ではドットの代わりにアンダースコア (_) や別の区切り文字を使用してください。
例:
上記のCREATE TABLE DDLステートメントでは、Goalsというネストされたデータ構造を宣言しており、コンバージョン、つまり達成された目標に関するデータが含まれています。 visitsテーブルの各行は、0 件以上のコンバージョンに対応します。 flatten_nested設定を0にすると (デフォルトはflatten_nested=1) 、任意のレベルのネストをサポートできます。 通常、ネストされたデータ構造を扱う場合、そのカラムはドット区切りのカラム名で指定します。 これらのカラムは、対応する型の配列を構成します。 1 つのネストされたデータ構造に属するすべてのカラム配列は、同じ長さです。 例えば:
ネストされたデータ構造は、長さが одинаковい複数のカラム配列の集合と考えるのが最もわかりやすいです。

WHERE 句での Nested カラムのフィルタリング

Nested 構造の各カラムは Array として格納されるため、WHERE 句で参照すると、個々の要素ではなく各行の配列全体が返されます。ネストされたカラムをスカラー値と直接比較することはできないため、代わりに array functions を使用する必要があります。 たとえば、次のクエリは単に結果が 0 行になるのではなく、例外を発生させます。これは、Goals.ID の型が Array(UInt32) であり、equals(Array(UInt32), UInt32) が有効な比較ではないためです。
配列に特定の値が含まれているかを確認するには、has を使用します。
条件がより複雑な場合は、arrayExists を使用します:
length を使って配列の長さで絞り込んだり、notEmpty を使って空の配列を除外したりできます:
行全体ではなく、ネストされた構造内の個々の要素で絞り込むには、まず ARRAY JOIN を使って配列を展開します。 ARRAY JOIN の後は、各要素がそれぞれ個別の行になるため、WHERE 句はスカラー値に適用されます。 詳細については、ARRAY JOINを参照してください。例:
ネストされたデータ構造全体に対して SELECT を実行することはできません。明示的に指定できるのは、その一部である個々のカラムだけです。

データの挿入

INSERT クエリでは、ネストされたデータ構造を構成する各カラム配列を、個別のカラム配列としてそれぞれ別々に渡す必要があります。挿入時には、これらの長さがすべて同じであることがシステムによって検証されます。 各ネストされたサブカラムは、ドット記法 (Goals.IDGoals.Serial、…) でカラムリストに記述し、対応する値は配列になります:
1 つの行内にあるネストされたすべてのサブカラム配列は、同じ長さでなければなりません。長さが一致しない場合はエラーになります:
DESCRIBE クエリでは、ネストされたデータ構造内のカラムも同様に個別に表示されます。

ALTER の制限事項

ネストされたデータ構造に対する ALTER クエリには、次の制限があります。 サブカラムの追加 は通常どおり可能です。既存の Nested 構造に新しいサブカラムを追加できます。
サブカラムの削除は、個々のサブカラムに対しても行えます:
サブカラムの型の変更は可能で、ミューテーション (データの書き換え) がトリガーされます:
名前の変更には制限があります。同じネスト構造内のサブカラムであれば、名前を変更できます。
ただし、できないことは次のとおりです。
  • ネスト構造全体そのものをリネームすること (例: GoalsConversions にする) 。
  • サブカラムを別のネスト構造に移動すること (例: Goals.IDOtherNested.ID に移動する) 。
  • サブカラムをネスト構造の外に出したり、ネスト構造の中に入れたりすること (例: Goals.IDGoalID にする、またはその逆) 。
最終更新日 2026年7月2日