Operators
ClickHouseは、演算子をその優先度、結合性、結びつきを考慮してクエリ解析時に対応する関数に変換します。
アクセス演算子
a[N] – 配列要素へのアクセス。arrayElement(a, N)関数。
a.N – タプル要素へのアクセス。tupleElement(a, N)関数。
数値の否定演算子
-a – negate(a)関数。
タプルの否定については:tupleNegate。
乗算と除算演算子
a * b – multiply(a, b)関数。
タプルに数値を乗じる場合:tupleMultiplyByNumber、スカラー積の場合:dotProduct。
a / b – divide(a, b)関数。
タプルを数値で除算する場合:tupleDivideByNumber。
a % b – modulo(a, b)関数。
加算と減算演算子
a + b – plus(a, b)関数。
タプルの加算については:tuplePlus。
a - b – minus(a, b)関数。
タプルの減算については:tupleMinus。
比較演算子
equals関数
a = b – equals(a, b)関数。
a == b – equals(a, b)関数。
notEquals関数
a != b – notEquals(a, b)関数。
a <> b – notEquals(a, b)関数。
lessOrEquals関数
a <= b – lessOrEquals(a, b)関数。
greaterOrEquals関数
a >= b – greaterOrEquals(a, b)関数。
less関数
a < b – less(a, b)関数。
greater関数
a > b – greater(a, b)関数。
like関数
a LIKE s – like(a, b)関数。
notLike関数
a NOT LIKE s – notLike(a, b)関数。
ilike関数
a ILIKE s – ilike(a, b)関数。
BETWEEN関数
a BETWEEN b AND c – a >= b AND a <= cと同じ。
a NOT BETWEEN b AND c – a < b OR a > cと同じ。
データセット操作用演算子
in関数
a IN ... – in(a, b)関数。
notIn関数
a NOT IN ... – notIn(a, b)関数。
globalIn関数
a GLOBAL IN ... – globalIn(a, b)関数。
globalNotIn関数
a GLOBAL NOT IN ... – globalNotIn(a, b)関数。
inサブクエリ関数
a = ANY (subquery) – in(a, subquery)関数。  
notInサブクエリ関数
a != ANY (subquery) – a NOT IN (SELECT singleValueOrNull(*) FROM subquery)と同じ。
inサブクエリ関数
a = ALL (subquery) – a IN (SELECT singleValueOrNull(*) FROM subquery)と同じ。
notInサブクエリ関数
a != ALL (subquery) – notIn(a, subquery)関数。 
例
ALLを使用したクエリ:
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
結果:
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
ANYを使用したクエリ:
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
結果:
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
日付および時刻の操作用演算子
EXTRACT
EXTRACT(part FROM date);
日付から部分を抽出します。例えば、与えられた日付から月を取得したり、時刻から秒を取得できます。
partパラメーターは、取得したい日付の部分を指定します。以下の値が利用可能です:
- DAY— 月の日。可能な値:1〜31。
- MONTH— 月。可能な値:1〜12。
- YEAR— 年。
- SECOND— 秒。可能な値:0〜59。
- MINUTE— 分。可能な値:0〜59。
- HOUR— 時。可能な値:0〜23。
partパラメーターは大文字小文字を区別しません。
dateパラメーターは、処理対象の日付または時刻を指定します。DateまたはDateTime型がサポートされます。
例:
SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
次の例では、テーブルを作成し、そのテーブルにDateTimeタイプの値を挿入しています。
CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
)
ENGINE = Log;
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘
追加の例はテストで確認できます。
INTERVAL
DateおよびDateTimeタイプとの算術操作で使用されるIntervalタイプの値を作成します。
インターバルの種類:
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
INTERVALの値を設定する際に文字列リテラルも使用できます。例えば、INTERVAL 1 HOURはINTERVAL '1 hour'またはINTERVAL '1' hourと同一です。
異なるタイプのインターバルは組み合わせることができません。INTERVAL 4 DAY 1 HOURのような式は使用できません。インターバルを指定する際には、最小のインターバルユニットと同等またはそれより小さい単位を使用してください。例えばINTERVAL 25 HOURなど。以下の例のように逐次的な操作を行うことができます。
例:
SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘
INTERVAL構文またはaddDays関数は常に優先されます。単純な加算または減算(例:now() + ...のような構文)は、時間の設定を考慮しません。例えば、夏時間など。
例:
SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day;
┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐
│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┘
関連項目
- Intervalデータタイプ
- toIntervalタイプ変換関数
論理AND演算子
構文 SELECT a AND b — aとbの論理積を計算する関数and。
論理OR演算子
構文 SELECT a OR b — aとbの論理和を計算する関数or。
論理否定演算子
構文 SELECT NOT a — aの論理否定を計算する関数not。
条件演算子
a ? b : c – if(a, b, c)関数。
注意:
条件演算子は、bとcの値を計算した後、条件aが満たされているかを確認し、対応する値を返します。bまたはcがarrayJoin()関数であるとき、a条件に関わらず各行が複製されます。
条件式
CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END
xが指定されている場合、transform(x, [a, ...], [b, ...], c)関数が使用されます。そうでなければmultiIf(a, b, ..., c)。
式中にELSE c句がない場合、デフォルト値はNULLです。
transform関数はNULLを扱いません。
連結演算子
s1 || s2 – concat(s1, s2)関数。
ラムダ生成演算子
x -> expr – lambda(x, expr)関数。
以下の演算子は優先度を持たず、括弧です:
配列生成演算子
[x1, ...] – array(x1, ...)関数。
タプル生成演算子
(x1, x2, ...) – tuple(x1, x2, ...)関数。
結合性
全ての二項演算子は左結合性を持ちます。例えば、1 + 2 + 3はplus(plus(1, 2), 3)に変換されます。このため、時には予想通りに動作しないことがあります。例えば、SELECT 4 > 2 > 3は0を返します。
効率化のため、andやor関数は任意の数の引数を受け付けることができます。対応するANDとOR演算子のチェーンはこれらの関数の単一の呼び出しに変換されます。
NULLの確認
ClickHouseはIS NULLとIS NOT NULL演算子をサポートしています。
IS NULL
- Nullable型の値の場合、IS NULL演算子は以下を返します:- 値がNULLの場合は1。
- それ以外の場合は0。
 
- 値が
- その他の値の場合、IS NULL演算子は常に0を返します。
optimize_functions_to_subcolumns設定を有効にすることで最適化することができます。optimize_functions_to_subcolumns = 1の場合、関数は全カラムデータを読み取るのではなく、nullサブカラムのみを読み取ります。クエリSELECT n IS NULL FROM tableはSELECT n.null FROM TABLEに変換されます。
SELECT x+100 FROM t_null WHERE y IS NULL
┌─plus(x, 100)─┐
│          101 │
└──────────────┘
IS NOT NULL
- Nullable型の値の場合、IS NOT NULL演算子は以下を返します:- 値がNULLの場合は0。
- それ以外の場合は1。
 
- 値が
- その他の値の場合、IS NOT NULL演算子は常に1を返します。
SELECT * FROM t_null WHERE y IS NOT NULL
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘
optimize_functions_to_subcolumns設定を有効にすることで最適化することができます。optimize_functions_to_subcolumns = 1の場合、関数は全カラムデータを読み取るのではなく、nullサブカラムのみを読み取ります。クエリSELECT n IS NOT NULL FROM tableはSELECT NOT n.null FROM TABLEに変換されます。