13 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/sql-reference/operators/ | 38 | Operators |
Operators
ClickHouseは、演算子をその優先度、結合性、結びつきを考慮してクエリ解析時に対応する関数に変換します。
アクセス演算子
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 s
– like(a, b)
関数。
notLike関数
a NOT LIKE s
– notLike(a, b)
関数。
ilike関数
a ILIKE s
– 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
と同じ。
データセット操作用演算子
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 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘
追加の例はテストで確認できます。
INTERVAL
DateおよびDateTimeタイプとの算術操作で使用されるIntervalタイプの値を作成します。
インターバルの種類:
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
INTERVAL
の値を設定する際に文字列リテラルも使用できます。例えば、INTERVAL 1 HOUR
はINTERVAL '1 hour'
またはINTERVAL '1' hour
と同一です。
:::tip
異なるタイプのインターバルは組み合わせることができません。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 │
└─────────────────────┴─────────────────────┴─────────────────────┘
関連項目
- Intervalデータタイプ
- toIntervalタイプ変換関数
論理AND演算子
構文 SELECT a AND b
— a
とb
の論理積を計算する関数and。
論理OR演算子
構文 SELECT a OR b
— a
とb
の論理和を計算する関数or。
論理否定演算子
構文 SELECT NOT a
— a
の論理否定を計算する関数not。
条件演算子
a ? b : c
– if(a, b, c)
関数。
注意:
条件演算子は、bとcの値を計算した後、条件aが満たされているかを確認し、対応する値を返します。b
またはc
がarrayJoin()関数であるとき、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 || s2
– concat(s1, s2)関数。
ラムダ生成演算子
x -> expr
– lambda(x, expr)
関数。
以下の演算子は優先度を持たず、括弧です:
配列生成演算子
[x1, ...]
– array(x1, ...)
関数。
タプル生成演算子
(x1, x2, ...)
– tuple(x1, x2, ...)
関数。
結合性
全ての二項演算子は左結合性を持ちます。例えば、1 + 2 + 3
はplus(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 table
はSELECT 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 table
はSELECT NOT n.null FROM TABLE
に変換されます。