通常関数
関数には少なくとも* 2種類あります。通常関数(単に「関数」とも呼ばれます)と集約関数です。これは互いにまったく別の概念です。通常関数は、各行に対して個別に適用されるかのように動作します(各行に対する関数の結果は、他の行には依存しません)。集約関数は、複数の行から値の集合を蓄積します(つまり、すべての行の集合に依存します)。
このセクションでは通常関数について説明します。集約関数については「集約関数」のセクションを参照してください。
強い型付け
標準的な SQL と異なり、ClickHouse は強い型付けを採用しています。言い換えると、型間の暗黙的な変換は行われません。各関数は特定の型の組み合わせに対してのみ利用できます。このため、場合によっては型変換関数を使用する必要があります。
共通部分式除去
クエリ内で同一の AST(同一のノード、または構文解析結果が同じもの)を持つすべての式は、同じ値を持つと見なされます。これらの式はまとめられ、一度だけ実行されます。同一の副問い合わせも同様の方法で除去されます。
結果の型
すべての関数は、結果として単一の値のみを返します(複数の値を返したり、値を返さないことはありません)。結果の型は通常、値ではなく引数の型のみによって決まります。例外は、tupleElement 関数(a.N 演算子)および toFixedString 関数です。
定数
説明を簡単にするため、一部の関数は特定の引数について定数のみを受け付けます。例えば、LIKE 演算子の右側の引数は定数でなければなりません。
ほとんどすべての関数は、定数引数に対しては定数を返します。例外は乱数を生成する関数です。
now 関数は、異なるタイミングで実行されたクエリに対して異なる値を返しますが、結果は定数と見なされます。これは、定数であることが単一のクエリ内でのみ重要だからです。
定数式も定数と見なされます(たとえば、LIKE 演算子の右側は複数の定数から構成できます)。
関数は、定数引数と非定数引数に対して別々の実装になっている場合があります(実行されるコードが異なります)。しかし、定数に対する結果と、同じ値のみを含む通常の列に対する結果とは一致していなければなりません。
NULL の処理
関数は次のように動作します。
- 関数の引数のうち少なくとも 1 つが
NULLの場合、その関数の結果もNULLになります。 - 各関数の説明で個別に指定されている特殊な動作を持つものもあります。ClickHouse のソースコードでは、これらの関数は
UseDefaultImplementationForNulls=falseになっています。
不変性
関数は引数の値を変更できず、行われた変更はすべて結果として返されます。したがって、個々の関数の計算結果は、クエリ内で関数を記述する順序には依存しません。
高階関数
-> 演算子と lambda(params, expr) 関数
高階関数は、関数引数としてラムダ関数のみを受け取ります。ラムダ関数を高階関数に渡すには -> 演算子を使用します。矢印の左側には形式パラメータがあり、これは任意の ID(識別子)1 つ、またはタプル内の複数の形式パラメータ(任意の ID の組)です。矢印の右側には、これらの形式パラメータおよび任意のテーブル列を使用できる式が書かれます。
例:
複数の引数を受け取るラムダ関数も、高階関数に渡すことができます。この場合、高階関数にはラムダ関数の各引数に対応する、同一の長さを持つ複数の配列が渡されます。
一部の関数では、最初の引数(ラムダ関数)を省略できます。この場合、恒等写像が指定されたものとして扱われます。
ユーザー定義関数 (UDF)
ClickHouse はユーザー定義関数をサポートしています。詳しくは UDFs を参照してください。