ARRAY JOIN 句
配列カラムを含むテーブルにとって一般的な操作は、その初期カラムの各個々の配列要素を持つカラムを持つ新しいテーブルを生成し、他のカラムの値は複製されることです。これが ARRAY JOIN
句の基本的なケースです。
その名前は、配列やネストされたデータ構造との JOIN
を実行するものとして見ることができるという事実から来ています。意図は arrayJoin 関数に似ていますが、この句の機能はより広範です。
構文:
サポートされている ARRAY JOIN
のタイプは以下の通りです:
ARRAY JOIN
- 基本ケースでは、空の配列はJOIN
の結果には含まれません。LEFT ARRAY JOIN
-JOIN
の結果には空の配列を持つ行が含まれます。空の配列の場合、その値は配列要素タイプのデフォルト値(通常は0、空文字列またはNULL)に設定されます。
基本的な ARRAY JOIN の例
以下の例は、ARRAY JOIN
および LEFT ARRAY JOIN
句の使用法を示しています。Array タイプのカラムを持つテーブルを作成し、値を挿入します:
以下の例では、ARRAY JOIN
句を使用します:
次の例では、LEFT ARRAY JOIN
句を使用します:
エイリアスの使用
ARRAY JOIN
句では、配列にエイリアスを指定できます。この場合、配列要素にはこのエイリアスを使用してアクセスできますが、配列自体には元の名前でアクセスします。例:
エイリアスを使用することで、外部配列で ARRAY JOIN
を実行できます。例えば:
ARRAY JOIN
句では、複数の配列をカンマで区切ることができます。この場合、同時に JOIN
が実行されます(直和ではなく、デカルト積ではない)。すべての配列はデフォルトで同じサイズである必要があります。例:
以下の例では、arrayEnumerate 関数を使用します:
異なるサイズの複数の配列を結合するには、以下のようにします: SETTINGS enable_unaligned_array_join = 1
。例:
ネストされたデータ構造との ARRAY JOIN
ARRAY JOIN
は ネストされたデータ構造 にも対応しています:
ネストされたデータ構造の名前を ARRAY JOIN
で指定する場合の意味は、構成するすべての配列要素を持つ ARRAY JOIN
と同じです。以下の例を参照してください:
このバリエーションも意味があります:
ネストされたデータ構造にエイリアスを使用して、JOIN
結果またはソース配列のいずれかを選択できます。例:
ARRAY JOIN 関数の使用例:
実装の詳細
ARRAY JOIN
の実行順序は最適化されています。ARRAY JOIN
は常にクエリ内の WHERE/PREWHERE 句の前に指定する必要がありますが、技術的には、ARRAY JOIN
の結果がフィルタリングに使用されない限り、任意の順序で実行できます。処理順序は、クエリオプティマイザによって制御されます。
短絡条件の関数評価との互換性の欠如
短絡条件の関数評価は、if
、multiIf
、and
、およびor
の特定の関数における複雑な式の実行を最適化する機能です。これにより、ゼロ除算のような潜在的な例外が、これらの関数の実行中に発生するのを防ぎます。
arrayJoin
は常に実行され、短絡条件の関数評価にはサポートされていません。これは、arrayJoin
がクエリ分析と実行中に他のすべての関数とは別に処理され、短絡条件の関数実行で機能しない追加のロジックが必要であるためです。その理由は、結果の行数が arrayJoin
の結果に依存し、それを遅延実行するのは実装が複雑でコストがかかりすぎるからです。