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