第3の種類の関数として、‘arrayJoin’ 関数 が属するものがあります。また、テーブル関数 も別個に挙げることができます。
厳格な型付け
共通部分式除去
結果の型
定数
NULL の処理
- 関数の引数のうち少なくとも 1 つが
NULLの場合、関数の結果もNULLになります。 - 各関数の説明で個別に定義される特別な動作。ClickHouse のソースコードでは、これらの関数には
UseDefaultImplementationForNulls=falseが設定されています。
不変性
高階関数
-> 演算子と lambda(params, expr) 関数
-> 演算子を使用します。矢印の左側には仮引数を指定します。これは任意の ID 1 つ、またはタプル内の任意の ID による複数の仮引数です。矢印の右側には式を指定し、この式ではこれらの仮引数に加えて、任意のテーブルのカラムも使用できます。
例:
関数名をそのままラムダとして使う
arrayMap(plus, ...) では、plus が 2 つの引数を取るため、アリティ 2 が使われます。そのため、arrayMap(plus, [(1, 10), (2, 20)]) のようなタプル入力でも動作し、この場合はタプル要素がラムダの引数にアンパックされます。
可変長の内側の関数 (任意個の引数を受け取る concat など) の場合、ラムダのアリティは配列引数の数にフォールバックします。これは、arrayMap、arrayFilter、arrayFold のような高階関数では正しい動作です。一方、配列に加えて固定の非配列パラメータも受け取る高階関数、たとえば arrayPartialSort(f, limit, arr) では、可変長関数名をそのまま使うと誤ったアリティになることがあり、その場合は明示的なラムダが必要です。
また、可変長の内側の関数では、タプル入力は自動的にはアンパックされません。たとえば、arrayMap(concat, [('a', 'b'), ('c', 'd')]) は単項ラムダに書き換えられ、arrayMap((x, y) -> concat(x, y), [('a', 'b'), ('c', 'd')]) と同等ではありません。タプル要素を分解して可変長呼び出しに渡したい場合は、明示的なラムダを使用してください。