定期関数
少なくとも*二種類の関数があります - 定期関数(単に「関数」と呼ばれます)と集約関数です。これらは全く異なる概念です。定期関数は、各行に対して個別に適用されるかのように機能します(各行の関数の結果は他の行に依存しません)。集約関数は、さまざまな行からの値のセットを累積します(つまり、行の全体セットに依存します)。
このセクションでは定期関数について説明します。集約関数については、「集約関数」というセクションを参照してください。
強い型付け
標準SQLとは対照的に、ClickHouseは強い型付けを持っています。言い換えれば、型間の暗黙の変換を行いません。各関数は特定の型セットに対して機能します。これは、型変換関数を使用する必要がある場合があることを意味します。
共通部分式の消去
クエリ内のすべての式は、同じAST(同じレコードまたは同じ構文解析の結果)を持つ場合、同一の値を持つと見なされます。そのような式は連結され、一度だけ実行されます。同一のサブクエリもこの方法で消去されます。
結果の型
すべての関数は、単一の値を結果として返します(複数の値やゼロの値ではありません)。結果の型は通常、引数の型によってのみ定義され、値によっては定義されません。例外は、tupleElement 関数(a.N 演算子)と toFixedString 関数です。
定数
簡便さのために、特定の関数は一部の引数についてのみ定数で動作できる場合があります。例えば、LIKE 演算子の右側の引数は定数でなければなりません。 ほぼすべての関数は、定数引数に対して定数を返します。例外はランダム数を生成する関数です。 'now' 関数は、異なる時間に実行されたクエリに対して異なる値を返しますが、その結果は単一のクエリ内での一貫性が重要であるため、定数と見なされます。 定数式もまた定数と見なされます(例えば、LIKE 演算子の右側の半分は複数の定数から構成できます)。
関数は定数引数と非定数引数に対して異なる方法で実装されることがあります(異なるコードが実行されます)。しかし、定数の場合と、同じ値を含む真のカラムの場合の結果は一致するべきです。
NULL 処理
関数は次のように動作します:
- 引数のいずれかが
NULL
の場合、関数の結果もNULL
です。 - 各関数の説明に個別に指定されている特別な動作。ClickHouse のソースコードでは、これらの関数は
UseDefaultImplementationForNulls=false
です。
不変性
関数は引数の値を変更することはできません - いかなる変更も結果として返されます。したがって、個別の関数を計算した結果は、クエリ内に書かれた関数の順序には依存しません。
高階関数
->
演算子と lambda(params, expr) 関数
高階関数は、その関数引数としてのみラムダ関数を受け入れることができます。高階関数にラムダ関数を渡すには ->
演算子を使用します。矢印の左側には形式的なパラメータがあり、任意のIDまたはタプル内の複数の形式的パラメータが入ります。矢印の右側には、これらの形式的パラメータや任意のテーブルカラムを使用することができる式があります。
例:
複数の引数を受け入れるラムダ関数も高階関数に渡すことができます。この場合、高階関数には、これらの引数に対応する同じ長さの複数の配列が渡されます。
一部の関数では、最初の引数(ラムダ関数)を省略できます。この場合、同一のマッピングが仮定されます。
ユーザー定義関数 (UDFs)
ClickHouse はユーザー定義関数をサポートしています。詳細は UDFs を参照してください。