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

概要

算術関数は、UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32、または Float64 型の任意の 2 つのオペランドに対して使用できます。 演算を実行する前に、両方のオペランドは結果型にキャストされます。結果型は次のように決定されます (ただし、以下の関数ドキュメントで別途 指定されている場合を除きます) 。
  • 両方のオペランドが 32 ビット以下の場合、結果型のサイズは、2 つのオペランドのうち大きい方の次に大きい型のサイズになります (整数サイズの昇格) 。たとえば、UInt8 + UInt16 = UInt32Float32 * Float32 = Float64 です。
  • いずれか一方のオペランドが 64 ビット以上の場合、結果型のサイズは 2 つのオペランドのうち大きい方と同じになります。たと えば、UInt32 + UInt128 = UInt128Float32 * Float64 = Float64 です。
  • いずれか一方のオペランドが符号付きであれば、結果型も符号付きになります。そうでない場合は符号なしになります。たとえば、UInt32 * Int32 = Int64UInt32 * UInt32 = UInt64 です。
これらの規則により、結果型は、取り得るすべての結果を表現できる最小の型になります。これにより値域の境界付近では オーバーフローのリスクが生じますが、64 ビットの最大ネイティブ整数幅を使って高速に計算できるようになります。この動作によ り、最大の整数型として 64 ビット整数 (BIGINT) を提供する多くの他のデータベースとの互換性も確保されます。 例:
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8         │ UInt16                 │ UInt32                          │ UInt64                                   │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘
オーバーフローは、C++ と同様に発生します。

abs

導入バージョン: v1.1.0 x の絶対値を計算します。x が符号なし型の場合は変化しません。x が符号付き型の場合は、符号なし数値を返します。 構文
abs(x)
引数
  • x — 絶対値を求める値
戻り値 x の絶対値 使用例
Query
SELECT abs(-0.5)
Response
0.5

avg2

導入バージョン: v25.11.0 指定された引数の平均値を計算して返します。 数値型および時間関連の型をサポートします。 構文
avg2(x1, x2])
引数
  • x1, x2] — 平均を求める 2 つの値を受け取ります。
戻り値 指定された引数の平均値を返します。結果の型は、互換性のある最大の型になります。 数値型
Query
SELECT avg2(toUInt8(3), 1.0) AS result, toTypeName(result) AS type;
-- 返される型はFloat64です。UInt8を比較のために64ビットに昇格させる必要があるためです。
Response
┌─result─┬─type────┐
│      2 │ Float64 │
└────────┴─────────┘
Decimal型
Query
SELECT avg2(toDecimal32(1, 2), 2) AS result, toTypeName(result) AS type;
Response
┌─result─┬─type──────────┐
│    1.5 │ Decimal(9, 2) │
└────────┴───────────────┘
Date型
Query
SELECT avg2(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
Response
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘
DateTime 型
Query
SELECT avg2(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
Response
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘
Time64型
Query
SELECT avg2(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
Response
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘

byteSwap

導入バージョン: v23.10.0 整数のバイト順を反転します。つまり、エンディアンを変更します。 以下の例は、次のように考えることができます。
  1. 10進整数を、ビッグエンディアンの16進表現に変換します。つまり、3351772109 -> C7 C7 FB CD (4バイト)
  2. バイト順を反転します。つまり、C7 C7 FB CD -> CD FB C7 C7
  3. 結果をビッグエンディアンとみなして整数に戻します。つまり、CD FB C7 C7 -> 3455829959 この関数の用途の1つは、IPv4 アドレスのバイト順を反転することです。
┌─toIPv4(byteSwap(toUInt32(toIPv4('205.251.199.199'))))─┐
│ 199.199.251.205                                       │
└───────────────────────────────────────────────────────┘
構文
byteSwap(x)
引数 戻り値 バイト順を反転した x を返します。(U)Int* 使用例
Query
SELECT byteSwap(3351772109)
Response
3455829959
8ビット
Query
SELECT byteSwap(54)
Response
54
16ビット
Query
SELECT byteSwap(4135)
Response
10000
32ビット
Query
SELECT byteSwap(3351772109)
Response
3455829959
64ビット
Query
SELECT byteSwap(123294967295)
Response
18439412204227788800

divide

導入バージョン: v1.1.0 2 つの値 ab の商を計算します。結果の型は常に Float64 です。 整数除算には intDiv 関数を使用します。
0 による除算では、inf-inf、または nan が返されます。
構文
divide(x, y)
引数
  • x — 被除数 - y — 除数
戻り値 xy で割った商 2 つの数値を割る
Query
SELECT divide(25,5) AS quotient, toTypeName(quotient)
Response
5 Float64
ゼロ除算
Query
SELECT divide(25,0)
Response
inf

divideDecimal

導入バージョン: v22.12.0 2 つの Decimal に対して除算を行います。結果の値の型は Decimal256 です。 結果の scale は result_scale 引数 (範囲 [0, 76] の定数 Integer) で明示的に指定できます。指定しない場合、結果の scale は指定された引数の最大 scale になります。
この関数は通常の divide より大幅に低速です。 精度を厳密に制御する必要がない場合や、高速な計算が必要な場合は、divide の使用を検討してください。
構文
divideDecimal(x, y[, result_scale])
引数
  • x — 最初の値: Decimal. - y — 2 番目の値: Decimal. - result_scale — 結果のスケール。型は Int/UInt
戻り値 指定したスケールでの除算結果です。Decimal256 例 1
Query
divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)
Response
┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐
│                                                -5.7142857142 │
└──────────────────────────────────────────────────────────────┘
例 2
Query
SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1);
SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5);
Response
┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐
│                                             -5.7 │
└──────────────────────────────────────────────────┘
┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 5)─┐
│ -12 │ 2.1 │                                                       -5.7 │                                                   -5.71428 │
└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘

divideOrNull

導入バージョン: v25.5.0 divide と同様ですが、0 で除算した場合は NULL を返します。 構文
divideOrNull(x, y)
引数
  • x — 被除数 - y — 除数
戻り値 xy の商、または NULL。 ゼロによる除算
Query
SELECT divideOrNull(25, 0)
Response
\N

gcd

導入バージョン: v1.1.0 2 つの値 ab の最大公約数を返します。 0 で除算した場合、または最小の負の数をマイナス 1 で除算した場合は、 例外が送出されます。 構文
gcd(x, y)
引数
  • x — 最初の整数 - y — 2 つ目の整数
戻り値 xy の最大公約数。 使用例
Query
SELECT gcd(12, 18)
Response
6

ifNotFinite

導入バージョン: v20.3.0 浮動小数点値が有限かどうかを判定します。 三項演算子 を使っても、同様の結果を得られます: isFinite(x) ? x : y. 構文
ifNotFinite(x,y)
引数
  • x — 無限かどうかを確認する値。Float*
  • y — フォールバック値。Float*
戻り値
  • x が有限の場合は x
  • x が有限でない場合は y
使用例
Query
SELECT 1/0 AS infimum, ifNotFinite(infimum,42)
Response
inf  42

intDiv

導入バージョン: v1.1.0 2 つの値 xy で整数除算します。つまり、 商を切り下げて計算します。 結果のビット幅は被除数 (最初のパラメータ) と同じです。 0 で除算した場合、商が被除数の範囲に収まらない場合、 または最小の負数をマイナス 1 で除算した場合は、例外が発生します。 構文
intDiv(x, y)
引数
  • x — 左側のオペランド。 - y — 右側のオペランド。
戻り値 xy で整数除算した結果 2 つの浮動小数点数を整数除算する
Query
SELECT intDiv(toFloat64(1), 0.001) AS res, toTypeName(res)
Response
┌──res─┬─toTypeName(intDiv(toFloat64(1), 0.001))─┐
│ 1000 │ Int64                                   │
└──────┴─────────────────────────────────────────┘
商が被除数の範囲内に収まらない
Query
SELECT
intDiv(1, 0.001) AS res,
toTypeName(res)
Response
Received exception from server (version 23.2.1):
Code: 153. DB::Exception: Received from localhost:9000. DB::Exception:
Cannot perform integer division, because it will produce infinite or too
large number: While processing intDiv(1, 0.001) AS res, toTypeName(res).
(ILLEGAL_DIVISION)

intDivOrNull

導入バージョン: v25.5.0 intDiv と同様ですが、0 で除算した場合、または最小の負数を -1 で除算した場合は NULL を返します。 構文
intDivOrNull(x, y)
引数
  • x — 左側のオペランド。(U)Int*
  • y — 右側のオペランド。(U)Int*
戻り値 xy で整数除算した結果、または NULL。 0 による整数除算
Query
SELECT intDivOrNull(1, 0)
Response
\N
最小の負数を -1 で割る
Query
SELECT intDivOrNull(-9223372036854775808, -1)
Response
\N

intDivOrZero

導入バージョン: v1.1.0 intDiv と同様ですが、0 による除算時、または最小の負の数を -1 で除算した場合は 0 を返します。 構文
intDivOrZero(a, b)
引数
  • a — 左側のオペランド。(U)Int*
  • b — 右側のオペランド。(U)Int*
戻り値 a を b で整数除算した結果、または 0。 0 での整数除算
Query
SELECT intDivOrZero(1, 0)
Response
0
最小の負数を-1で割る
Query
SELECT intDivOrZero(0.05, -1)
Response
0

isFinite

導入バージョン: v1.1.0 Float32 または Float64 の引数が無限大でも NaN でもない場合は 1 を返し、 それ以外の場合は 0 を返します。 構文
isFinite(x)
引数
  • x — 有限かどうかを判定する数値。Float*
戻り値 x が無限大でも NaN でもない場合は 1、それ以外の場合は 0 を返します。 数値が有限かどうかを判定する
Query
SELECT isFinite(inf)
Response
0

isInfinite

導入バージョン: v1.1.0 Float32 または Float64 の引数が無限大の場合は 1 を返し、それ以外の場合は 0 を返します。 NaN に対しては 0 が返される点に注意してください。 構文
isInfinite(x)
引数
  • x — 無限大かどうかを判定する数値。Float*
戻り値 x が無限大の場合は 1、それ以外の場合は 0 (NaN を含む) 。 数値が無限大かどうかを判定する
Query
SELECT isInfinite(inf), isInfinite(NaN), isInfinite(10))
Response
1 0 0

isNaN

導入バージョン: v1.1.0 引数の Float32 または Float64 が NaN の場合は 1 を返し、それ以外の場合は 0 を返します。 構文
isNaN(x)
引数
  • xNaN かどうかを判定する引数。Float*
戻り値 NaN の場合は 1、それ以外は 0 使用例
Query
SELECT isNaN(NaN)
Response
1

lcm

導入バージョン: v1.1.0 2 つの値 xy の最小公倍数を返します。 ゼロで除算した場合、または最小の負の数をマイナス 1 で除算した場合は、例外がスローされます。 構文
lcm(x, y)
引数 戻り値 xy の最小公倍数を返します。(U)Int* 使用例
Query
SELECT lcm(6, 8)
Response
24

max2

導入バージョン: v21.11.0 2 つの数値 xy のうち、より大きい方を返します。 構文
max2(x, y)
引数 戻り値 xy のうち大きい方の値を返します。 Float64 使用例
Query
SELECT max2(-1, 2)
Response
2

midpoint

導入バージョン: v25.11.0 指定された引数の平均値を計算して返します。 数値型および日時型をサポートします。 構文
midpoint(x1[, x2, ...])
引数
  • x1[, x2, ...] — 平均を求める対象として、単一の値または複数の値を受け取ります。
戻り値 指定された引数の平均値を返します。結果の型は、互換性のある最大の型に昇格されます。 数値型
Query
SELECT midpoint(1, toUInt8(3), 0.5) AS result, toTypeName(result) AS type;
-- UInt8 は比較のために 64 ビットに昇格する必要があるため、返される型は Float64 になります。
Response
┌─result─┬─type────┐
│    1.5 │ Float64 │
└────────┴─────────┘
Decimal型
Query
SELECT midpoint(toDecimal32(1.5, 2), toDecimal32(1, 1), 2) AS result, toTypeName(result) AS type;
Response
┌─result─┬─type──────────┐
│    1.5 │ Decimal(9, 2) │
└────────┴───────────────┘
Date型
Query
SELECT midpoint(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
Response
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘
DateTime型
Query
SELECT midpoint(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
Response
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘
Time64 型
Query
SELECT midpoint(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
Response
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘

min2

導入バージョン: v21.11.0 2 つの数値 xy のうち、小さいほうの値を返します。 構文
min2(x, y)
引数 戻り値 xy のうち、より小さい値を返します。 Float64 使用例
Query
SELECT min2(-1, 2)
Response
-1

minus

導入バージョン: v1.1.0 2 つの値 ab の差を計算します。結果は常に符号付きとなります。 plus と同様に、日付または日時から整数を減算できます。 さらに、日時同士の減算もサポートされており、その場合は両者の時間差が返されます。 構文
minus(x, y)
引数
  • x — 被減数。 - y — 減数。
戻り値 x から y を引いた値 2 つの数値の減算
Query
SELECT minus(10, 5)
Response
5
整数と日付の減算
Query
SELECT minus(toDate('2025-01-01'),5)
Response
2024-12-27

modulo

導入バージョン: v1.1.0 値 a を b で割った剰余を計算します。 両方の入力が整数の場合、結果の型は整数になります。入力の 一方が浮動小数点数の場合、結果の型は Float64 になります。 余りは C++ と同様に計算されます。負の数に対しては、 切り捨て除算が使用されます。 0 による除算、または最小の負の数をマイナス 1 で割った場合は、 例外が発生します。 構文
modulo(a, b)
別名: mod 引数
  • a — 被除数 - b — 除数 (法)
戻り値 a % b の剰余 使用例
Query
SELECT modulo(5, 2)
Response
1

moduloLegacy

導入バージョン: v1.1.0 除算の剰余を計算します。これは C++ の % 演算子を使用する従来の modulo 実装で、負の引数に対しては負の結果を返すことがあります。この関数は、古いテーブルのパーティション化ロジックとの後方互換性を保つために用意されています。標準的な動作が必要な場合は、modulo または positiveModulo を使用してください。 構文
moduloLegacy(a, b)
引数 戻り値 除算の剰余を返します。(U)Int* または Float* 基本的な使い方
Query
SELECT moduloLegacy(10, 3)
Response
1

moduloOrNull

導入バージョン: v25.5.0 ab で割ったときの剰余を計算します。関数 modulo と似ていますが、moduloOrNull は 右側の引数が 0 の場合に NULL を返します。 構文
moduloOrNull(x, y)
別名: modOrNull 引数 戻り値 xy で割った剰余を返します。除数が 0 の場合は NULL を返します。 除数が 0 の moduloOrNull
Query
SELECT moduloOrNull(5, 0)
Response
\N

moduloOrZero

導入バージョン: v20.3.0 modulo と同様ですが、除数が 0 の場合は、modulo 関数のように例外を返すのではなく、0 を返します。 構文
moduloOrZero(a, b)
引数 戻り値 a % b の剰余を返します。除数が 0 の場合は 0 を返します。 使用例
Query
SELECT moduloOrZero(5, 0)
Response
0

multiply

導入バージョン: v1.1.0 2 つの値 xy の積を計算します。 構文
multiply(x, y)
引数 戻り値 x と y の積を返します 2 つの数値を乗算する
Query
SELECT multiply(5,5)
Response
25

multiplyDecimal

導入バージョン: v22.12.0 2 つの Decimal に対して乗算を行います。結果の値の型は Decimal256 です。 結果のスケールは、result_scale 引数 (範囲 [0, 76] の定数 Integer) で明示的に指定できます。指定しない場合、結果のスケールは指定された引数のスケールの最大値になります。
これらの関数は通常の multiply と比べて大幅に低速です。 精度を厳密に制御する必要がなく、または高速な計算が必要な場合は、multiply の使用を検討してください
構文
multiplyDecimal(a, b[, result_scale])
引数
  • a — 最初の値。Decimal
  • b — 2番目の値。Decimal
  • result_scale — 結果のスケール。(U)Int*
戻り値 指定したスケールでの乗算結果。型: Decimal256 使用例
Query
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
Response
25.2
通常の乗算との違い
Query
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
Response
┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│                                               -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│                                                         -26.8609 │
└──────────────────────────────────────────────────────────────────┘
Decimalのオーバーフロー
Query
SELECT
    toDecimal64(-12.647987876, 9) AS a,
    toDecimal64(123.967645643, 9) AS b,
    multiplyDecimal(a, b);
SELECT
    toDecimal64(-12.647987876, 9) AS a,
    toDecimal64(123.967645643, 9) AS b,
    a * b;
Response
┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐
│ -12.647987876 │ 123.967645643 │                                                               -1567.941279108 │
└───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘
Received exception from server (version 22.11.1):
Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow:
While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW)

negate

導入バージョン: v1.1.0 引数 x の符号を反転します。結果は常に符号付きになります。 構文
negate(x)
引数
  • x — 符号を反転する値。
戻り値 x の符号を反転した値を返します 使用例
Query
SELECT negate(10)
Response
-10

plus

導入バージョン: v1.1.0 2 つの値 xy の合計を計算します。別名: x + y (演算子) 。 整数と日付、または日時を加算することもできます。前者では 日付に日数が加算され、後者では 日時に秒数が加算されます。 日付と時刻を加算することもできます。DateTime を 加算すると、DateTime が生成されます。DateTime64、または Date32Time もしくは Time64 を加算すると、DateTime64 が生成されます。 構文
plus(x, y)
引数
  • x — 左側のオペランド。 - y — 右側のオペランド。
戻り値 x と y の和を返します 2つの数値を加算する
Query
SELECT plus(5,5)
Response
10
整数と日付の加算
Query
SELECT plus(toDate('2025-01-01'),5)
Response
2025-01-06
日付と時刻を加算する
Query
SELECT toDate('2025-01-01') + CAST('14:30:25', 'Time')
Response
2025-01-01 14:30:25

positiveModulo

導入バージョン: v22.11.0 xy で割った剰余を計算します。関数 modulo と似ていますが、positiveModulo は常に 0 以上の数を返します。 構文
positiveModulo(x, y)
別名: positive_modulo, pmod 引数 戻り値 x から、y で割り切れ、x を超えない最大の整数を引いた値を返します。 使用例
Query
SELECT positiveModulo(-1, 10)
Response
9

positiveModuloOrNull

導入バージョン: v25.5.0 ab で割った剰余を計算します。関数 positiveModulo と似ていますが、positiveModuloOrNull は 右側の引数が 0 の場合は NULL を返します。 構文
positiveModuloOrNull(x, y)
別名: positive_modulo_or_null, pmodOrNull 引数 戻り値 x から、y で割り切れ、かつ x 以下の最大の整数を引いた差を返します。除数が 0 の場合は null を返します。 positiveModuloOrNull
Query
SELECT positiveModuloOrNull(5, 0)
Response
\N
最終更新日 2026年6月10日