メインコンテンツへスキップ
メインコンテンツへスキップ

演算子

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

Date型およびDateTime型の値との算術演算で使用されるInterval型の値を作成します。

間隔の型:

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

:::note
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 band関数を使用してabの論理積を計算します。

論理OR演算子

構文 SELECT a OR bor関数を使用してabの論理和を計算します。

論理否定演算子

構文 SELECT NOT anot 関数を使用して a の論理否定を計算します。

条件演算子

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に変換されます。