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.ID、Goals.Serial、…) でカラムリストに記述し、対応する値は配列になります:
DESCRIBE クエリでは、ネストされたデータ構造内のカラムも同様に個別に表示されます。
ALTER の制限事項
ALTER クエリには、次の制限があります。
サブカラムの追加 は通常どおり可能です。既存の Nested 構造に新しいサブカラムを追加できます。
- ネスト構造全体そのものをリネームすること (例:
GoalsをConversionsにする) 。 - サブカラムを別のネスト構造に移動すること (例:
Goals.IDをOtherNested.IDに移動する) 。 - サブカラムをネスト構造の外に出したり、ネスト構造の中に入れたりすること (例:
Goals.IDをGoalIDにする、またはその逆) 。