メインコンテンツまでスキップ
メインコンテンツまでスキップ

算術関数

概要

算術関数は、UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32、または Float64 の任意の2つのオペランドで動作します。

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

  • 両方のオペランドが32ビット幅までの場合、結果型のサイズは、2つのオペランドのうちの大きい方の次に大きい型のサイズになります(整数サイズの昇格)。例えば UInt8 + UInt16 = UInt32 または Float32 * Float32 = Float64 です。
  • オペランドの1つが64ビット以上の場合、結果型のサイズは2つのオペランドのうちの大きい方と同じサイズになります。例えば UInt32 + UInt128 = UInt128 または Float32 * Float64 = Float64 です。
  • オペランドの1つが符号付きの場合、結果型も符号付きになります。そうでない場合は符号なしになります。例えば UInt32 * Int32 = Int64 です。

これらのルールは、結果型がすべての可能な結果を表現できる最小の型になることを保証します。このことは、値の範囲境界周辺でのオーバーフローのリスクを導入しますが、計算が最大のネイティブ整数幅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

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 この関数の使用例は、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

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

注記

0 で割ると inf-inf、または nan を返します。

構文

divide(x, y)

引数

  • x — 被除数 - y — 除数

返される値

xy の商

2つの数値の割り算

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

0で割り算

SELECT divide(25,0)
inf

divideDecimal

導入時期: v22.12

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

注記

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

構文

divideDecimal(x, y[, result_scale])

引数

  • x — 第一値: Decimal. - y — 第二値: 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 — 除数

返される値

xy の商、またはNULL。

0で割り算

SELECT divideOrNull(25, 0)
\N

gcd

導入時期: v1.1

2つの値 ab の最大公約数を返します。

0で割るか、最小の負の数をマイナス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 で整数除算します。つまり、次に小さい整数に切り下げた商を計算します。

結果は被除数(最初のパラメータ)と同じ幅になります。

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 と同じですが、0で割るか最小の負の数をマイナス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 と同じですが、0で割るとゼロを返します。最小の負の数をマイナス1で割った場合もゼロを返します。

構文

intDivOrZero(a, b)

引数

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

返される値

ab の整数除算結果、またはゼロ。

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 の最小公倍数を返します。

0で割るか、最小の負の数をマイナス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

min2

導入時期: v21.11

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

構文

min2(x, y)

引数

返される値

xy の小さい方の値を返します。 Float64

使用例

SELECT min2(-1, 2)
-1

minus

導入時期: v1.1

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

構文

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つの値 ab で割った余りを計算します。

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

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

0で割る場合や最小の負の数をマイナス1で割る場合は例外がスローされます。

構文

modulo(a, b)

引数

  • a — 被除数 - b — 除数(モジュラス)

返される値

a % b の余り

使用例

SELECT modulo(5, 2)
1

moduloOrNull

導入時期: v25.5

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

構文

moduloOrNull(x, y)

引数

返される値

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

0による moduloOrNull

SELECT moduloOrNull(5, 0)
\N

moduloOrZero

導入時期: v20.3

modulo に似ますが、除数がゼロの場合はゼロを返し、modulo 関数では例外をスローします。

構文

moduloOrZero(a, b)

引数

返される値

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

使用例

SELECT moduloOrZero(5, 0)
0

multiply

導入時期: v1.1

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

構文

multiply(x, y)

引数

返される値

xy の積を返します。

2つの数を掛ける

SELECT multiply(5,5)
25

multiplyDecimal

導入時期: v22.12

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

注記

これらの関数は通常の multiply よりもかなり遅く処理されます。 制御された精度が本当に必要ない場合や、迅速な計算が必要な場合は、 multiply の使用を検討してください。

構文

multiplyDecimal(a, b[, result_scale])

引数

  • a — 第一の値。 Decimal
  • b — 第二の値。 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 │
└──────────────────────────────────────────────────────────────────┘

小数のオーバーフロー

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 — 右側のオペランド。

返される値

xy の合計を返します。

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)

引数

返される値

xy で割り切れる最も近い整数より小さい x の値の差を返します。

使用例

SELECT positiveModulo(-1, 10)
9

positiveModuloOrNull

導入時期: v25.5

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

構文

positiveModuloOrNull(x, y)

引数

返される値

xy で割り切れる最も近い整数より小さい x の値の差を返し除数がゼロのときは null を返します。

positiveModuloOrNull

SELECT positiveModuloOrNull(5, 0)
\N