メインコンテンツまでスキップ
メインコンテンツまでスキップ

演算子

ClickHouseは、優先度、優先順位、および結合性に応じて、クエリ解析段階で演算子を対応する関数に変換します。

アクセス演算子

a[N] – 配列の要素にアクセスします。arrayElement(a, N)関数。

a.N – タプル要素にアクセスします。tupleElement(a, N)関数。

数値否定演算子

-anegate(a)関数。

タプルの否定については: tupleNegate

乗算および除算演算子

a * bmultiply(a, b)関数。

タプルを数値で乗算する場合: tupleMultiplyByNumber、スカラー積の場合: dotProduct

a / bdivide(a, b)関数。

タプルを数値で除算する場合: tupleDivideByNumber

a % bmodulo(a, b)関数。

加算および減算演算子

a + bplus(a, b)関数。

タプルの加算については: tuplePlus

a - bminus(a, b)関数。

タプルの減算については: tupleMinus

比較演算子

equals関数

a = bequals(a, b)関数。

a == bequals(a, b)関数。

notEquals関数

a != bnotEquals(a, b)関数。

a <> bnotEquals(a, b)関数。

lessOrEquals関数

a <= blessOrEquals(a, b)関数。

greaterOrEquals関数

a >= bgreaterOrEquals(a, b)関数。

less関数

a < bless(a, b)関数。

greater関数

a > bgreater(a, b)関数。

like関数

a LIKE blike(a, b)関数。

notLike関数

a NOT LIKE bnotLike(a, b)関数。

ilike関数

a ILIKE bilike(a, b)関数。

BETWEEN関数

a BETWEEN b AND ca >= b AND a <= cと同じです。

a NOT BETWEEN b AND ca < b OR a > cと同じです。

データセット操作用の演算子

IN演算子およびEXISTS演算子を参照してください。

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 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘

さらに例については、testsを参照できます。

INTERVAL

Interval型の値を作成し、DateおよびDateTime型の値と算術演算に使用します。

間隔の種類:

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

INTERVAL値を設定する際に文字列リテラルを使用することもできます。たとえば、INTERVAL 1 HOURINTERVAL '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 │
└─────────────────────┴─────────────────────┴─────────────────────┘

参照

論理AND演算子

構文 SELECT a AND babの論理積を計算します。関数はandです。

論理OR演算子

構文 SELECT a OR babの論理和を計算します。関数はorです。

論理否定演算子

構文 SELECT NOT aaの論理否定を計算します。関数はnotです。

条件演算子

a ? b : cif(a, b, c)関数。

注意:

条件演算子は、bとcの値を計算し、条件aが満たされているかどうかを確認し、対応する値を返します。もしbまたはCarrayJoin()関数である場合、各行は「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 || s2concat(s1, s2)関数。

ラムダ生成演算子

x -> exprlambda(x, expr)関数です。

優先順位を持たない演算子もあり、それは括弧です:

配列生成演算子

[x1, ...]array(x1, ...)関数。

タプル生成演算子

(x1, x2, ...)tuple(x2, x2, ...)関数。

結合性

すべての二項演算子は左結合性を持ちます。たとえば、1 + 2 + 3plus(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 tableSELECT 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 tableSELECT NOT n.null FROM TABLEに変換されます。