4.5 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/sql-reference/functions/ | 1 | 概要 |
通常の関数
少なくとも* 2つのタイプの関数があります - 通常の関数(単に「関数」とも呼ばれます)と集約関数です。これらは全く異なる概念です。通常の関数は各行に個別に適用されるかのように動作します(各行ごとに、関数の結果は他の行に依存しません)。集約関数はさまざまな行から値のセットを累積します(つまり、行の全体セットに依存します)。
このセクションでは通常の関数について説明します。集約関数については、「集約関数」のセクションをご覧ください。
:::note ‘arrayJoin’ 関数が属する、3番目のタイプの関数があります。そして、テーブル関数も別途言及できます。 :::
強い型付け
標準SQLとは対照的に、ClickHouseは強い型付けを持っています。つまり、型間での暗黙の変換は行いません。各関数は特定の型セットに対して動作します。これは、型変換関数を使用する必要がある場合があることを意味します。
共通部分式の削除
クエリ内のすべての式が同じAST(同じ記録または構文解析の同じ結果)を持つとき、それらは同一の値を持つと見なされます。そのような式は連結され、1回だけ実行されます。同一のサブクエリもこの方法で削除されます。
結果のタイプ
すべての関数は結果として単一の戻り値を返します(複数の値でもなく、ゼロ値でもありません)。結果のタイプは通常、値ではなく引数の型によってのみ定義されます。例外は、tupleElement関数(a.N演算子)とtoFixedString関数です。
定数
簡便性のため、特定の関数は一部の引数に対してのみ定数で動作できます。たとえば、LIKE演算子の右側の引数は定数でなければなりません。ほとんどの関数は定数引数に対して定数を返します。例外は乱数を生成する関数です。「now」関数は、異なる時間に実行されたクエリに対して異なる値を返しますが、単一のクエリ内でのみ定数性が重要であるため、その結果は定数と見なされます。定数式も定数と見なされます(たとえば、LIKE演算子の右半分は複数の定数から構築できます)。
関数は定数引数と非定数引数に対して異なる方法で実装される場合があります(異なるコードが実行されます)。しかし、定数と同じ値だけを持つ真のカラムの結果は一致する必要があります。
NULL 処理
関数には次の動作があります:
- 少なくとも1つの引数が
NULL
の場合、関数の結果もNULL
です。 - 特別な動作が各関数の説明に個別に指定されています。ClickHouseのソースコードでは、これらの関数は
UseDefaultImplementationForNulls=false
でマークされています。
不変性
関数は引数の値を変更することはできません - すべての変更は結果として返されます。したがって、個々の関数を計算した結果は、クエリ内で関数が記述される順序に依存しません。
高階関数、->
演算子と lambda(params, expr) 関数
高階関数は、ラムダ関数のみをその機能引数として受け入れることができます。ラムダ関数を高階関数に渡すには、->
演算子を使用します。矢印の左側は形式上のパラメータであり、これは任意のID、またはタプル内の任意のIDになります。矢印の右側には、これらの形式上のパラメータ、および任意のテーブルカラムを使用できる式があります。
例:
x -> 2 * x
str -> str != Referer
複数の引数を受け入れるラムダ関数も高階関数に渡すことができます。この場合、高階関数には同じ長さの複数の配列が渡され、これらの引数が対応します。
一部の関数では、最初の引数(ラムダ関数)を省略できます。この場合、同一のマッピングが仮定されます。
ユーザー定義関数(UDFs)
ClickHouseはユーザー定義関数をサポートしています。UDFsをご覧ください。