アクセス演算子
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 b – like(a, b) 関数を表します。
notLike 関数
a NOT LIKE b — notLike(a, b) 関数。
ilike 関数
a ILIKE b – 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 と同じ意味です。
is not distinct from 演算子 (<=>)
25.10 以降では、
<=> を他の演算子と同様に使用できます。
25.10 より前は、JOIN 式でしか使用できませんでした。たとえば次のとおりです。<=> 演算子は、IS NOT DISTINCT FROM と等価な NULL セーフの等価演算子です。
通常の等価演算子 (=) と同様に動作しますが、NULL 値も比較できるものとして扱います。
NULL 値同士は等しいものと見なされ、NULL を NULL 以外の任意の値と比較した場合は、NULL ではなく 0 (false) を返します。
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 関数
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 を使用したクエリ:
Query
Response
Query
Response
配列に対する SOME / ALL
SOME / ALL の右辺には配列式 (配列リテラル、配列型のカラム、または配列を返す任意の式) を指定できます。これは PostgreSQL スタイルの配列量化子構文です。この構文は parse 時に認識され、配列関数に書き換えられるため、手動で書き換える必要はありません。
SOME は存在量化子です (ANY の SQL における同義語) 。= と <> は最適化された実装があるため、特別に has / NOT has に書き換えられます。一般形では、高階関数の arrayExists / arrayAll が使われます。
配列形式が認識されるのは、比較演算子 =, ==, !=, <>, <=>, <, <=, >, >=、キーワード比較 predicates の IS DISTINCT FROM と IS 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 検索関数も引き続き使用できます。
配列形式では
ANY はサポートされていません右辺に配列を指定できるのは SOME と ALL だけです。any は aggregate function でもあるため、expr = any(x) という shape の式は関数呼び出しとしての意味のまま扱われます。配列量化子には SOME を使用してください。Query
Response
NULL の扱いはサブクエリ形式とは異なります配列形式はパーサー内で書き換えられるため (この段階では transform_null_in などのクエリ設定は利用できず、また行単位の配列カラムではアナライザの null-safe な IN パスを使えません) 、has (= / <> の場合) および arrayExists / arrayAll の二値セマンティクスを使用します (これらは NULL 比較の不明な結果を 0 に畳み込みます) 。この挙動は、NULL の処理が IN / NOT IN を介して行われ、transform_null_in に依存するサブクエリ形式とは異なる場合があります。日付と時刻を扱う演算子
EXTRACT
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:30は5を返し、-3:30は-3を返します。TIMEZONE_MINUTE— オペランドの timezone の UTC オフセットの符号付き分部分。たとえば、+5:30は30を返し、-3:30は-30を返します。
part パラメータでは大文字と小文字は区別されません。
date パラメータは、処理する値を指定します。Date、Date32、DateTime、DateTime64、および Interval 型がサポートされています。date が Interval の場合、要求する part は、その interval に格納されている kind と一致している必要があります (たとえば、EXTRACT(DAY FROM INTERVAL 5 DAY) は許可されますが、EXTRACT(HOUR FROM INTERVAL 5 DAY) は拒否されます。これは ClickHouse の interval が単一の kind であるためです) 。Interval オペランドの結果は Int64 です。
例:
DateTime 型の値を挿入します。
INTERVAL
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
INTERVAL 値の設定時には、文字列リテラルを使用することもできます。たとえば、INTERVAL 1 HOUR は INTERVAL '1 hour' または INTERVAL '1' hour と同じです。
例:
INTERVAL 構文または addDays 関数を常に使用することを推奨します。単純な加算や減算 (now() + ... のような構文) では、時刻に関する設定が考慮されません。たとえば、夏時間です。- Interval データ型
- toInterval 型変換関数
日付と時刻の加算
+ 演算子を使用して Time または Time64 の値を加算できます。結果は、指定した時刻の日付を表す DateTime または DateTime64 になります。この演算は可換です。
結果の型は、オペランドの型によって決まります。
結果には session timezone が使用されます (session timezone が設定されていない場合は、server のデフォルトタイムゾーンが使用されます) 。結果が表現可能な範囲を超えた場合の動作は、
date_time_overflow_behavior 設定で制御されます。AT TIME ZONE と AT LOCAL
AT TIME ZONE と AT LOCAL は、DateTime または DateTime64 の値を別のタイムゾーンに変換します。これらは既存の toTimeZone 関数の糖衣構文です。
zone には、有効なタイムゾーン名として評価される任意の定数文字列表現を指定できます (例: 'America/Denver'、'UTC'、concat('America', '/', 'Denver')) 。AT TIME ZONE は toTimeZone に展開されるため、タイムゾーン引数に関する同じルールが適用されます。カラム参照のような非定数式には、allow_nonconst_timezone_arguments = 1 が必要です。
AT LOCAL は現在のsession timezoneを使用します (session timezone が設定されていない場合は server のデフォルトを使用します) 。Distributed 分散テーブルでは、session_timezone を明示的に設定する必要があります。これが空の場合、timeZone() は分片ごとのローカル値となり、定数の toTimeZone 引数としては使用できないため、ILLEGAL_COLUMN 例外が発生します。
PostgreSQL では、
timestamp without time zone AT TIME ZONE zone は wall-clock 値をまず指定した zone の時刻として再解釈してから変換しますが、ClickHouse では常に同じ絶対時刻を保持し、表示に使用するタイムゾーンラベルだけを変更します。どちらの形式も toTimeZone と等価であり、基になる timestamp は変更されません。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') として結び付けられます。演算の後にタイムゾーン変換を適用するには、明示的に括弧を使用します。
論理 AND 演算子
SELECT a AND b — 関数 and を用いて a と b の論理積を計算します。
論理 OR 演算子
SELECT a OR b — 関数 or を使用して、a と b の論理和を計算します。
論理否定演算子
SELECT NOT a — 関数 not を使って、a の論理否定を計算します。
条件演算子
a ? b : c – if(a, b, c) 関数。
注:
条件演算子は、まず b と c の値を計算し、次に条件 a が満たされているかどうかを判定して、対応する値を返します。b または C が arrayJoin() 関数である場合、“a” の条件にかかわらず各行が複製されます。
条件式
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) 関数。
以下の演算子は括弧であるため、優先順位を持ちません:
Array作成演算子
[x1, ...] – array(x1, ...) 関数。
Tuple 生成演算子
(x1, x2, ...) – tuple(x2, x2, ...) 関数。
結合性
1 + 2 + 3 は plus(plus(1, 2), 3) に変換されます。
ただし、常に期待どおりの動作になるとは限りません。たとえば、SELECT 4 > 2 > 3 の結果は 0 になります。
効率化のため、and 関数と or 関数は任意個の引数を受け取れます。対応する AND および OR 演算子の連鎖は、これらの関数への単一の呼び出しに変換されます。
NULL かどうかの確認
IS NULL および IS NOT NULL 演算子をサポートしています。
IS NULL
- Nullable 型の値に対して、
IS NULL演算子は次の値を返します。- 値が
NULLの場合は1。 - それ以外の場合は
0。
- 値が
- その他の値に対しては、
IS NULL演算子は常に0を返します。
optimize_functions_to_subcolumns = 1 の場合、この関数はカラム全体のカラムデータを読み取って処理する代わりに、null サブカラムだけを読み取ります。クエリ SELECT n IS NULL FROM table は SELECT n.null FROM TABLE に変換されます。
IS NOT NULL
- Nullable 型の値に対しては、
IS NOT NULL演算子は次の値を返します。- 値が
NULLの場合は0 - それ以外の場合は
1
- 値が
- その他の値に対しては、
IS NOT NULL演算子は常に1を返します。
optimize_functions_to_subcolumns = 1 の場合、関数はカラムデータ全体を読み取って処理する代わりに、null サブカラムだけを読み取ります。クエリ SELECT n IS NOT NULL FROM table は SELECT NOT n.null FROM TABLE に変換されます。
ブール値の確認
IS TRUE、IS FALSE、IS UNKNOWN、IS NOT TRUE、IS NOT FALSE、IS NOT UNKNOWN の演算子をサポートしています。
これらは、Bool および Nullable(Bool) の式に対して使用されます。
expr IS TRUEは、exprがtrueの場合にのみ1を返します。expr IS FALSEは、exprがfalseの場合にのみ1を返します。expr IS UNKNOWNは、exprがNULLの場合にのみ1を返します。expr IS NOT TRUEは、exprがfalseまたはNULLの場合に1を返します。expr IS NOT FALSEは、exprがtrueまたはNULLの場合に1を返します。expr IS NOT UNKNOWNは、exprがNULLではない場合に1を返します。
IS UNKNOWN は IS NULL と等価であり、IS NOT UNKNOWN は IS NOT NULL と等価です。