arrayJoin 関数は各行を受け取り、行の集合を生成します (unfold) 。
この関数は引数として配列を受け取り、その配列の要素数に応じて元の行を複数の行に展開します。
すべてのカラムの値はそのままコピーされますが、この関数が適用されるカラムの値だけは、対応する配列の値に置き換えられます。
配列が空の場合、
arrayJoin は行を生成しません。
配列型のデフォルト値を含む 1 行を返すには、emptyArrayToSingle でラップします。たとえば、arrayJoin(emptyArrayToSingle(...)) のようにします。Query
Response
arrayJoin 関数は、WHERE 句を含むクエリのすべての部分に影響します。以下のクエリでは、サブクエリが返したのは 1 行だけであるにもかかわらず、結果が 2 になる点に注目してください。
Query
Response
arrayJoin 関数を使用できます。この場合、変換は複数回行われ、行数がその分だけ増えます。
たとえば:
Query
Response
ベストプラクティス
arrayJoin を使用すると、共通部分式の除去により、期待どおりの結果にならない場合があります。
そのような場合は、繰り返し使用する配列式に、結果に影響しない追加の操作を加えて変更することを検討してください。たとえば、arrayJoin(arraySort(arr))、arrayJoin(arrayConcat(arr, []))
例:
Query
ARRAY JOIN構文に注目してください。これにより、より柔軟な処理が可能になります。
ARRAY JOINを使うと、同じ要素数を持つ複数の配列を一度に変換できます。
例:
Query
Response
Tuple を使用できます。
例:
Query
Row
arrayJoin という名前は、JOIN 演算との概念的な類似性に由来していますが、その対象は 1 行内の配列です。従来の JOIN が異なるテーブルの行を結合するのに対し、arrayJoin は 1 行内の配列の各要素を「結合」し、他のカラムの値を複製しながら、配列要素ごとに 1 行ずつ複数の行を生成します。ClickHouse では ARRAY JOIN 句の構文も提供されており、使い慣れた SQL の JOIN 用語を用いることで、従来の JOIN 演算との関係がさらに明確になっています。この処理は配列の「展開」とも呼ばれますが、関数名と句の両方で “join” という語が使われているのは、テーブルを配列要素と結合するのに似ており、結果として JOIN 演算と同様の形でデータセットを効果的に拡張するためです。