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