アクセス演算子
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 時に認識され、配列関数に書き換えられるため、手動で書き換える必要はありません。
| 構文 | 書き換え後 |
|---|---|
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 が使われます。
配列形式が認識されるのは、比較演算子 =, ==, !=, <>, <=>, <, <=, >, >= のみです。右辺に配列を取れるその他の演算子 — たとえば LIKE, ILIKE, NOT LIKE, REGEXP, IN — は配列量化子には 書き換えられず、通常どおりの意味を保ちます。たとえば 'abc' LIKE SOME(['a%', 'b%']) は配列量化子構文ではありません。そのような場合は、arrayExists / arrayAll を直接使用してください。
配列形式では
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 になります。この演算は可換です。
結果の型は、オペランドの型によって決まります。
| 左オペランド | 右オペランド | 結果の型 |
|---|---|---|
Date | Time | DateTime |
Date | Time64(s) | DateTime64(s) |
Date32 | Time | DateTime64(0) |
Date32 | Time64(s) | DateTime64(s) |
結果には session timezone が使用されます (session timezone が設定されていない場合は、server のデフォルトタイムゾーンが使用されます) 。結果が表現可能な範囲を超えた場合の動作は、
date_time_overflow_behavior 設定で制御されます。論理 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 と等価です。