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

算術関数

概要

算術関数は、UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32Float64 型の任意の 2 つのオペランドに対して動作します。

演算を実行する前に、両方のオペランドは結果型にキャストされます。結果型は(後述の各関数のドキュメントで別途指定されていない限り)次のように決定されます。

  • 両方のオペランドが 32 ビット以下の場合、結果型のサイズは、2 つのオペランドのうち大きい方よりも 1 段階大きい型のサイズになります(整数サイズの昇格)。例: 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

x の絶対値を計算します。x が符号なし型の場合は結果に影響はありません。x が符号付き型の場合は、符号なしの値を返します。

構文

abs(x)

引数

  • x — 絶対値を求める対象の値

戻り値

x の絶対値

使用例

SELECT abs(-0.5)
0.5

avg2

導入バージョン: v25.11

指定された引数の平均値を計算して返します。 数値型および時間型をサポートします。

構文

avg2(x1, x2])

引数

  • x1, x2] — 平均値を計算するために 2 つの値を受け取ります。

戻り値

指定された引数の平均を計算し、その結果を互換性のある型のうち最大の型に昇格させて返します。

数値型

SELECT avg2(toUInt8(3), 1.0) AS result, toTypeName(result) AS type;
-- The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
┌─result─┬─type────┐
│      2 │ Float64 │
└────────┴─────────┘

Decimal 型

SELECT avg2(toDecimal32(1, 2), 2) AS result, toTypeName(result) AS type;
┌─result─┬─type──────────┐
│    1.5 │ Decimal(9, 2) │
└────────┴───────────────┘

日付型

SELECT avg2(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘

DateTime 型

SELECT avg2(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘

Time64 型

SELECT avg2(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘

byteSwap

導入バージョン: v23.10

整数のバイト列を逆順にし、すなわちそのエンディアンを変換します。

以下の例は次のようにして導き出せます:

  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*

使用例

SELECT byteSwap(3351772109)
3455829959

8ビット

SELECT byteSwap(54)
54

16ビット

SELECT byteSwap(4135)
10000

32ビット

SELECT byteSwap(3351772109)
3455829959

64ビット

SELECT byteSwap(123294967295)
18439412204227788800

divide

導入バージョン: v1.1

2つの値 ab の商を計算します。結果の型は常に Float64 です。 整数除算は intDiv 関数で提供されます。

注記

0 で割った場合、inf-inf、または nan を返します。

構文

divide(x, y)

引数

  • x — 被除数、y — 除数

戻り値

x を y で割った商

2 つの数値の割り算

SELECT divide(25,5) AS quotient, toTypeName(quotient)
5 Float64

ゼロ除算

SELECT divide(25,0)
inf

divideDecimal

導入バージョン: v22.12

2つの Decimal 値に対して除算を実行します。結果の値の型は Decimal256 になります。 結果のスケールは、result_scale 引数([0, 76] の範囲の定数 Integer)で明示的に指定できます。指定しない場合、結果のスケールは与えられた引数のスケールの最大値になります。

注記

これらの関数は通常の divide よりもかなり遅く動作します。 精度を厳密に制御する必要がない場合や、高速な計算が必要な場合は、divide の使用を検討してください。

構文

divideDecimal(x, y[, result_scale])

引数

  • x — 第1引数の値: Decimal. - y — 第2引数の値: Decimal. - result_scale — 結果のスケール。型 Int/UInt.

戻り値

指定されたスケールでの除算結果。Decimal256

使用例

例 1

divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)
┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐
│                                                -5.7142857142 │
└──────────────────────────────────────────────────────────────┘

例 2

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);
┌─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

divide と同様ですが、0 で除算した場合は NULL を返します。

構文

divideOrNull(x, y)

引数

  • x — 被除数 - y — 除数

返り値

x を y で割った商、または NULL。

ゼロ除算

SELECT divideOrNull(25, 0)
\N

gcd

導入: v1.1

2 つの値 a と b の最大公約数を返します。

ゼロで除算した場合、または最小の負の値をマイナス 1 で除算した場合には、例外がスローされます。

構文

gcd(x, y)

引数

  • x — 1番目の整数 - y — 2番目の整数

返り値

xy の最大公約数。

使用例

SELECT gcd(12, 18)
6

ifNotFinite

導入バージョン: v20.3

浮動小数点値が有限かどうかを判定します。

三項演算子 を使用して、同様の結果を得ることができます: isFinite(x) ? x : y

構文

ifNotFinite(x,y)

引数

  • x — 無限大かどうかを判定する値。Float*
  • y — フォールバック値。Float*

返り値

  • x が有限なら x
  • x が有限でない場合は y

使用例

SELECT 1/0 AS infimum, ifNotFinite(infimum,42)
inf  42

intDiv

導入バージョン: v1.1

2 つの値 xy で整数除算します。言い換えると、 商を計算し、それを小さい方の整数へ切り捨てます。

結果のビット幅は被除数(1 番目のパラメータ)と同じです。

0 による除算を行った場合、商が被除数の表現可能範囲に収まらない場合、 または最小の負の数を -1 で除算した場合には、例外がスローされます。

構文

intDiv(x, y)

引数

  • x — 左側のオペランド。 - y — 右側のオペランド。

戻り値

xy で整数除算した結果。

2 つの浮動小数点数の整数除算

SELECT intDiv(toFloat64(1), 0.001) AS res, toTypeName(res)
┌──res─┬─toTypeName(intDiv(toFloat64(1), 0.001))─┐
│ 1000 │ Int64                                   │
└──────┴─────────────────────────────────────────┘

商が被除数の範囲内に収まりません

SELECT
intDiv(1, 0.001) AS res,
toTypeName(res)
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

intDiv と同様ですが、ゼロ除算、または最小負の値をマイナス 1 で除算した場合に NULL を返します。

構文

intDivOrNull(x, y)

引数

  • x — 左側のオペランド。(U)Int*
  • y — 右側のオペランド。(U)Int*

戻り値

xy で整数除算した結果、または NULL。

0 による整数除算

SELECT intDivOrNull(1, 0)
\N

最小の負の整数をマイナス1で割る

SELECT intDivOrNull(-9223372036854775808, -1)
\N

intDivOrZero

導入バージョン: v1.1

intDiv と同様ですが、ゼロ除算または最小の負の整数値をマイナス 1 で除算した場合にゼロを返します。

構文

intDivOrZero(a, b)

引数

  • a — 左辺オペランド。(U)Int*
  • b — 右辺オペランド。(U)Int*

戻り値

a を b で整数除算した結果、または 0。

0 での整数除算

SELECT intDivOrZero(1, 0)
0

最小の負の値を -1 で割る

SELECT intDivOrZero(0.05, -1)
0

isFinite

導入: v1.1

Float32 または Float64 の引数が無限大ではなく、かつ NaN でもない場合に 1 を返し、 それ以外の場合は 0 を返します。

構文

isFinite(x)

引数

  • x — 有限かどうかを判定する数値。Float*

戻り値

x が無限大でもなく NaN でもない場合は 1、それ以外は 0

数値が有限かどうかを確認する

SELECT isFinite(inf)
0

isInfinite

導入バージョン: v1.1

Float32 または Float64 型の引数が無限大である場合は 1 を返し、それ以外の場合、この関数は 0 を返します。 NaN の場合も 0 が返されることに注意してください。

構文

isInfinite(x)

引数

  • x — 無限大かどうかを判定する数値。Float*

戻り値

x が無限大であれば 1、それ以外の場合は 0NaN を含む)。

数値が無限大かどうかを判定する

SELECT isInfinite(inf), isInfinite(NaN), isInfinite(10))
1 0 0

isNaN

導入: v1.1

Float32 および Float64 型の引数が NaN の場合は 1 を返し、それ以外の場合は 0 を返します。

構文

isNaN(x)

引数

  • xNaN かどうかを判定する対象。Float*

戻り値

NaN の場合は 1、それ以外は 0

使用例

SELECT isNaN(NaN)
1

lcm

導入バージョン: v1.1

2つの値 xy の最小公倍数を返します。

ゼロで除算した場合、または最小の負の値を -1 で除算した場合には、例外がスローされます。

構文

lcm(x, y)

引数

返される値

xy の最小公倍数を返します。(U)Int*

使用例

SELECT lcm(6, 8)
24

max2

導入バージョン: v21.11

2 つの数値 xy のうち大きい方の値を返します。

構文

max2(x, y)

引数

返り値

xy のうち、より大きい値を返します。Float64

使用例

SELECT max2(-1, 2)
2

midpoint

導入バージョン: v25.11

指定された引数の平均値を計算して返します。 数値型および日時型をサポートします。

構文

midpoint(x1[, x2, ...])

引数

  • x1[, x2, ...] — 平均値を計算する対象として、単一または複数の値を受け取ります。

返される値

指定された引数の平均値を返し、その値は互換性のある型のうち最大の型に昇格されます。

数値型

SELECT midpoint(1, toUInt8(3), 0.5) AS result, toTypeName(result) AS type;
-- The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
┌─result─┬─type────┐
│    1.5 │ Float64 │
└────────┴─────────┘

Decimal 型

SELECT midpoint(toDecimal32(1.5, 2), toDecimal32(1, 1), 2) AS result, toTypeName(result) AS type;
┌─result─┬─type──────────┐
│    1.5 │ Decimal(9, 2) │
└────────┴───────────────┘

日付型

SELECT midpoint(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘

DateTime 型

SELECT midpoint(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘

Time64 型

SELECT midpoint(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘

min2

導入バージョン: v21.11

2つの数値 xy のうち、小さい方を返します。

構文

min2(x, y)

引数

返り値

xy のうち小さい方の値を返します。型は Float64 です。

使用例

SELECT min2(-1, 2)
-1

minus

導入バージョン: v1.1

2 つの値 ab の差を計算します。結果は常に符号付きです。 plus と同様に、日付または日時から整数を減算できます。 さらに、日時同士の減算もサポートされており、その時間差が結果として得られます。

構文

minus(x, y)

引数

  • x — 被減数。 - y — 減数。

戻り値

x から y を引いた値

2 つの数値を減算する

SELECT minus(10, 5)
5

整数と日付の減算処理

SELECT minus(toDate('2025-01-01'),5)
2024-12-27

modulo

導入バージョン: v1.1

2つの値 a を b で割った余りを計算します。

両方の入力が整数の場合、結果の型は整数です。入力の一方が浮動小数点数の場合、結果の型は Float64 になります。

余りは C++ と同様に計算されます。負の数に対しては切り捨て除算が使用されます。

0 で割った場合、または最小の負の値を -1 で割った場合には、例外がスローされます。

構文

modulo(a, b)

エイリアス: mod

引数

  • a — 被除数 - b — 除数(法、モジュロ)

戻り値

a % b の剰余

使用例

SELECT modulo(5, 2)
1

moduloOrNull

導入: v25.5

ab で割った余りを計算します。関数 modulo と同様ですが、右側の引数が 0 の場合には moduloOrNull は NULL を返します。

構文

moduloOrNull(x, y)

エイリアス: modOrNull

引数

返される値

xy で割った余り、または除数がゼロのときは null を返します。

ゼロ除算時の moduloOrNull

SELECT moduloOrNull(5, 0)
\N

moduloOrZero

導入: v20.3

modulo 関数と同様ですが、除数がゼロの場合に modulo 関数が例外を送出するのとは異なり、この関数は 0 を返します。

構文

moduloOrZero(a, b)

引数

戻り値

a % b の余りを返します。除数が 0 の場合は 0 を返します。

使用例

SELECT moduloOrZero(5, 0)
0

multiply

導入バージョン: v1.1

2つの値 xy の積を計算します。

構文

multiply(x, y)

引数

返り値

x と y の積を返します。

2 つの数値の乗算

SELECT multiply(5,5)
25

multiplyDecimal

導入バージョン: v22.12

2 つの Decimal 型の値に対して乗算を実行します。結果の値の型は Decimal256 になります。 結果のスケールは result_scale 引数(範囲 [0, 76] の const Integer)で明示的に指定できます。指定しない場合、結果のスケールは与えられた引数のうち最大のスケールになります。

注記

これらの関数は通常の multiply よりもかなり遅く動作します。 精度を厳密に制御する必要がない、あるいは高速な計算が必要な場合は、multiply の使用を検討してください。

構文

multiplyDecimal(a, b[, result_scale])

引数

  • a — 1 番目の値。Decimal
  • b — 2 番目の値。Decimal
  • result_scale — 結果のスケール。(U)Int*

戻り値

指定されたスケールでの乗算結果。型: Decimal256

使用例

SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
25.2

通常の乗算との違い

SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│                                               -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│                                                         -26.8609 │
└──────────────────────────────────────────────────────────────────┘

Decimal 型のオーバーフロー

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;
┌─────────────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

引数 x の符号を反転します。結果は常に符号付きです。

構文

negate(x)

引数

  • x — 負にする値。

戻り値

x に対して -x を返します。

使用例

SELECT negate(10)
-10

plus

導入バージョン: v1.1

2 つの値 xy の和を計算します。エイリアス: x + y(演算子)。 整数と日付、または整数と日時を加算できます。前者の演算では日付の日数を増やし、後者の演算では日時の秒数を増やします。

構文

plus(x, y)

引数

  • x — 左側のオペランド。 - y — 右側のオペランド。

戻り値

x と y の和を返します。

2 つの数値を加算する

SELECT plus(5,5)
10

整数と日付の加算

SELECT plus(toDate('2025-01-01'),5)
2025-01-06

positiveModulo

導入バージョン: v22.11

xy で割ったときの余りを計算します。関数 modulo と似ていますが、positiveModulo は常に非負の数値を返す点が異なります。

構文

positiveModulo(x, y)

別名: positive_modulo, pmod

引数

返り値

x 以下で y で割り切れる最も近い整数を x から引いた値を返します。

使用例

SELECT positiveModulo(-1, 10)
9

positiveModuloOrNull

導入バージョン: v25.5

ab で割ったときの余りを計算します。関数 positiveModulo と似ていますが、第2引数が 0 の場合には positiveModuloOrNull は NULL を返します。

構文

positiveModuloOrNull(x, y)

別名: positive_modulo_or_null, pmodOrNull

引数

戻り値

xy で割り切れる x 以下の最も近い整数まで切り下げ、その値との差を返します。除数が 0 の場合は null を返します。

positiveModuloOrNull

SELECT positiveModuloOrNull(5, 0)
\N