Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

演算子

ClickHouse では、クエリのパース時に、演算子の優先度・優先順位・結合性に応じて、演算子が対応する関数に変換されます。

アクセス演算子

a[N] – 配列要素へのアクセス。arrayElement(a, N) 関数。 N には整数の配列も指定でき、その場合はそれらすべての位置の要素が配列として返されます。 これは arrayMap(i -> a[i], N) と同じです。位置は Nullable にできます。要素型を Nullable でラップできる場合、NULL の位置は NULL になります。 Nullable に含められない要素型 (ArrayMap など) の場合は、スカラーの NULL 索引と同様に、 要素型のデフォルト値になります。

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) 関数と同等です。

match 関数

a REGEXP bmatch(a, b) 関数。

a ~ bmatch(a, b) 関数 (PostgreSQL スタイルの正規表現マッチ) 。

notMatch 関数

a !~ bnotMatch(a, b) 関数 (a が正規表現 b に一致しないかを確認します) 。

matchCaseInsensitive 関数

a ~* bmatchCaseInsensitive(a, b) 関数 (大文字と小文字を区別しない正規表現に一致) 。

notMatchCaseInsensitive 関数

a !~* bnotMatchCaseInsensitive(a, b) 関数 (a が正規表現 b に大文字と小文字を区別せずに一致しないかどうかを確認します) 。

BETWEEN 関数

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

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

is not distinct from 演算子 (<=>)

<=> 演算子は、IS NOT DISTINCT FROM と等価な NULL セーフの等価演算子です。 通常の等価演算子 (=) と同様に動作しますが、NULL 値も比較できるものとして扱います。 NULL 値同士は等しいものと見なされ、NULLNULL 以外の任意の値と比較した場合は、NULL ではなく 0 (false) を返します。

SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘

Stringを扱う演算子

OVERLAY

  • OVERLAY(string PLACING replacement FROM offset) - overlay(string, replacement, offset) 関数。
  • OVERLAY(string PLACING replacement FROM offset FOR length) - overlay(string, replacement, offset, length) 関数。
  • OVERLAYUTF8(string PLACING replacement FROM offset) - overlayUTF8(string, replacement, offset) 関数。
  • OVERLAYUTF8(string PLACING replacement FROM offset FOR length) - overlayUTF8(string, replacement, offset, length) 関数。

データセットを扱う演算子

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 サブクエリ function

a = ANY (subquery)in(a, subquery) 関数を表します。

notIn サブクエリ関数

a != ANY (subquery)a NOT IN (SELECT singleValueOrNull(*) FROM subquery) と同じです。

in サブクエリ function

a = ALL (subquery)a IN (SELECT singleValueOrNull(*) FROM subquery) と同じです。

notIn サブクエリ function

a != ALL (subquery)notIn(a, subquery) 関数です。

ALL を使用したクエリ:

Querysql
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
Responsetext
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

ANY を使うクエリ:

Querysql
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
Responsetext
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘

配列に対する SOME / ALL

上で説明したサブクエリ形式に加えて、SOME / ALL の右辺には配列式 (配列リテラル、配列型のカラム、または配列を返す任意の式) を指定できます。これは PostgreSQL スタイルの配列量化子構文です。この構文は parse 時に認識され、配列関数に書き換えられるため、手動で書き換える必要はありません。

構文 書き換え後
expr = SOME(arr) has(arr, expr)
expr <> ALL(arr) NOT has(arr, expr)
expr OP SOME(arr) (その他のサポートされる演算子) arrayExists(x -> expr OP x, arr)
expr OP ALL(arr) (その他のサポートされる演算子) arrayAll(x -> expr OP x, arr)

SOME は存在量化子です (ANY の SQL における同義語) 。=<> は最適化された実装があるため、特別に has / NOT has に書き換えられます。一般形では、高階関数の arrayExists / arrayAll が使われます。

配列形式が認識されるのは、比較演算子 =, ==, !=, <>, <=>, <, <=, >, >=、キーワード比較 predicates の IS DISTINCT FROMIS NOT DISTINCT FROM、および文字列検索 predicates の LIKE, ILIKE, NOT LIKE, NOT ILIKE, REGEXP です。キーワード比較 predicates と文字列検索 predicates は、配列形式でのみ認識され、サブクエリ形式では認識されません (サブクエリ形式は IN/NOT IN に変換されます) 。配列量化子としての意味を持たない演算子 — たとえば IN 自体 — は 書き換えられず、通常どおりの意味を保ちます。

文字列検索 predicates が機能するのは、MatchImpl (LIKE / ILIKE / REGEXP の実装) が、定数の haystack と非定数の needle をサポートしているためです。たとえば、'abc' LIKE SOME(['a%', 'b%'])arrayExists(x -> 'abc' LIKE x, ['a%', 'b%']) に、'abc' NOT LIKE ALL(['x%', 'y%'])arrayAll(x -> 'abc' NOT LIKE x, ['x%', 'y%']) に書き換えられます。これにより、1 つの文字列を複数の pattern に対して照合できます。単一の結合パスで照合したい場合は、multiMatchAny (regular expressions) や multiSearchAny (substrings) などの複数 pattern 検索関数も引き続き使用できます。

Querysql
SELECT
    3 = SOME([1, 2, 3, 4])         AS in_array,
    5 < SOME([1, 2, 6])            AS less_than_some,
    5 > ALL([1, 2, 3])             AS greater_than_all,
    'abc' LIKE SOME(['a%', 'z%'])  AS like_some;
Responsetext
┌─in_array─┬─less_than_some─┬─greater_than_all─┬─like_some─┐
│        1 │              1 │                1 │         1 │
└──────────┴────────────────┴──────────────────┴───────────┘

日付と時刻を扱う演算子

EXTRACT

EXTRACT(part FROM date);

指定した日付から各要素を抽出します。たとえば、指定した日付から月を取得したり、時刻から秒を取得したりできます。

part パラメータは、日付のどの要素を取得するかを指定します。使用できる値は次のとおりです。

  • NANOSECOND — ナノ秒。設定可能な値: 0–999999999。
  • MICROSECOND — マイクロ秒。設定可能な値: 0–999999。
  • MILLISECOND — ミリ秒。設定可能な値: 0–999。
  • SECOND — 秒。設定可能な値: 0–59。
  • MINUTE — 分。設定可能な値: 0–59。
  • HOUR — 時。設定可能な値: 0–23。
  • DAY — 日。設定可能な値: 1–31。
  • WEEK — ISO 8601 の週番号。設定可能な値: 1–53。
  • MONTH — 月の番号。設定可能な値: 1–12。
  • QUARTER — 四半期。設定可能な値: 1–4。
  • YEAR — 年。
  • EPOCH — Unix timestamp (1970-01-01 00:00:00 UTC からの秒数) 。注: DateTime64 では、小数秒部分は切り捨てられます。
  • DOW — 曜日 (PostgreSQL互換) 。0 = 日曜日、6 = 土曜日。
  • DOY — 年内通算日。設定可能な値: 1–366。
  • ISODOW — ISO の曜日。1 = 月曜日、7 = 日曜日。
  • ISOYEAR — ISO 8601 の週番号に対応する年。
  • CENTURY — 世紀。たとえば、2024年は21世紀です。
  • DECADE — 十年単位 (年を 10 で割ったもの) 。たとえば、2024年の十年単位の値は 202 です。
  • MILLENNIUM — 千年紀。たとえば、2024年は第3千年紀です。
  • TIMEZONE_HOUR — オペランドの timezone の UTC オフセットの符号付き時部分。たとえば、+5:305 を返し、-3:30-3 を返します。
  • TIMEZONE_MINUTE — オペランドの timezone の UTC オフセットの符号付き分部分。たとえば、+5:3030 を返し、-3:30-30 を返します。

part パラメータでは大文字と小文字は区別されません。

date パラメータは、処理する値を指定します。DateDate32DateTimeDateTime64、および Interval 型がサポートされています。dateInterval の場合、要求する part は、その interval に格納されている kind と一致している必要があります (たとえば、EXTRACT(DAY FROM INTERVAL 5 DAY) は許可されますが、EXTRACT(HOUR FROM INTERVAL 5 DAY) は拒否されます。これは ClickHouse の interval が単一の kind であるためです) 。Interval オペランドの結果は Int64 です。

例:

SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
SELECT EXTRACT(EPOCH FROM toDateTime('2024-01-15 12:30:45', 'UTC'));
SELECT EXTRACT(DOW FROM toDate('2024-01-15'));
SELECT EXTRACT(CENTURY FROM toDate('2024-01-01'));
SELECT EXTRACT(TIMEZONE_HOUR   FROM toDateTime('2024-01-15 12:00:00', 'Asia/Kolkata'));    -- 5
SELECT EXTRACT(TIMEZONE_MINUTE FROM toDateTime('2024-01-15 12:00:00', 'Asia/Kolkata'));    -- 30
SELECT EXTRACT(DAY   FROM INTERVAL 40 DAY);                                                -- 40
SELECT EXTRACT(MONTH FROM INTERVAL 7 MONTH);                                               -- 7

次の例では、テーブルを作成し、そのテーブルに DateTime 型の値を挿入します。

CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
) ENGINE = MergeTree
ORDER BY ();
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 HOURINTERVAL '1 hour' または INTERVAL '1' 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 │
└─────────────────────┴────────────────────────────────────────────────────────────┘

例:

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

関連項目

日付と時刻の加算

Date または Date32 の値には、+ 演算子を使用して Time または Time64 の値を加算できます。結果は、指定した時刻の日付を表す DateTime または DateTime64 になります。この演算は可換です。

結果の型は、オペランドの型によって決まります。

左オペランド 右オペランド 結果の型
Date Time DateTime
Date Time64(s) DateTime64(s)
Date32 Time DateTime64(0)
Date32 Time64(s) DateTime64(s)

例:

SET use_legacy_to_time = 0;
SELECT toDate('2024-07-15') + toTime('14:30:25') AS dt, toTypeName(dt);
┌──────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25 │ DateTime       │
└─────────────────────┴────────────────┘
SELECT toDate('2024-07-15') + toTime64('14:30:25.123456', 6) AS dt, toTypeName(dt);
┌─────────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25.123456 │ DateTime64(6)  │
└────────────────────────────┴────────────────┘
SELECT toTime64('23:59:59.999', 3) + toDate32('2024-07-15') AS dt, toTypeName(dt);
┌──────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 23:59:59.999 │ DateTime64(3)  │
└─────────────────────────┴────────────────┘

AT TIME ZONE と AT LOCAL

後置演算子 AT TIME ZONEAT LOCAL は、DateTime または DateTime64 の値を別のタイムゾーンに変換します。これらは既存の toTimeZone 関数の糖衣構文です。

Syntax Equivalent
expr AT TIME ZONE zone toTimeZone(expr, zone)
expr AT LOCAL toTimeZone(expr, timeZone())

zone には、有効なタイムゾーン名として評価される任意の定数文字列表現を指定できます (例: 'America/Denver''UTC'concat('America', '/', 'Denver')) 。AT TIME ZONEtoTimeZone に展開されるため、タイムゾーン引数に関する同じルールが適用されます。カラム参照のような非定数式には、allow_nonconst_timezone_arguments = 1 が必要です。

AT LOCAL は現在のsession timezoneを使用します (session timezone が設定されていない場合は server のデフォルトを使用します) 。Distributed 分散テーブルでは、session_timezone を明示的に設定する必要があります。これが空の場合、timeZone() は分片ごとのローカル値となり、定数の toTimeZone 引数としては使用できないため、ILLEGAL_COLUMN 例外が発生します。

AT TIME ZONE の演算子優先順位は 13 です (12 の *///% より高く、11 の +/- より高い) 、これは PostgreSQL と同じです。つまり、a * ts AT TIME ZONE 'tz'a * (ts AT TIME ZONE 'tz') として結び付けられ、ts + interval AT TIME ZONE 'tz'ts + (interval AT TIME ZONE 'tz') として結び付けられます。演算の後にタイムゾーン変換を適用するには、明示的に括弧を使用します。

-- Explicit parens required to add first, then convert timezone
SELECT (TIMESTAMP '2001-02-16 20:38:40' + INTERVAL 1 HOUR) AT TIME ZONE 'America/Denver';
-- Equivalent to:
SELECT toTimeZone(TIMESTAMP '2001-02-16 20:38:40' + INTERVAL 1 HOUR, 'America/Denver');

例:

SET session_timezone = 'UTC';

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver';
┌─toTimeZone(toDateTime('2001-02-16 20:38:40'), 'America/Denver')─┐
│ 2001-02-16 13:38:40                                              │
└──────────────────────────────────────────────────────────────────┘
SELECT TIMESTAMP '2001-02-16 20:38:40' AT LOCAL;
┌─toTimeZone(toDateTime('2001-02-16 20:38:40'), timeZone())─┐
│ 2001-02-16 20:38:40                                        │
└────────────────────────────────────────────────────────────┘

関連項目

論理 AND 演算子

構文 SELECT a AND b — 関数 and を用いて ab の論理積を計算します。

論理 OR 演算子

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

論理否定演算子

構文 SELECT NOT a — 関数 not を使って、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) 関数。

以下の演算子は括弧であるため、優先順位を持ちません:

Array作成演算子

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

Tuple 生成演算子

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

ブール値の確認

ClickHouse は、IS TRUEIS FALSEIS UNKNOWNIS NOT TRUEIS NOT FALSEIS NOT UNKNOWN の演算子をサポートしています。 これらは、Bool および Nullable(Bool) の式に対して使用されます。

  • expr IS TRUE は、exprtrue の場合にのみ 1 を返します。
  • expr IS FALSE は、exprfalse の場合にのみ 1 を返します。
  • expr IS UNKNOWN は、exprNULL の場合にのみ 1 を返します。
  • expr IS NOT TRUE は、exprfalse または NULL の場合に 1 を返します。
  • expr IS NOT FALSE は、exprtrue または NULL の場合に 1 を返します。
  • expr IS NOT UNKNOWN は、exprNULL ではない場合に 1 を返します。

ブール式では、IS UNKNOWNIS NULL と等価であり、IS NOT UNKNOWNIS NOT NULL と等価です。

CREATE TABLE t_bool (x Nullable(Bool)) ENGINE = Memory;
INSERT INTO t_bool VALUES (true), (false), (NULL);

SELECT
    x,
    x IS TRUE,
    x IS FALSE,
    x IS UNKNOWN,
    x IS NOT TRUE,
    x IS NOT FALSE,
    x IS NOT UNKNOWN
FROM t_bool;
Navigation