算術関数
概要
算術関数は、UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32、Float64 型の任意の 2 つのオペランドに対して動作します。
演算を実行する前に、両方のオペランドは結果型にキャストされます。結果型は(後述の各関数のドキュメントで別途指定されていない限り)次のように決定されます。
- 両方のオペランドが 32 ビット以下の場合、結果型のサイズは、2 つのオペランドのうち大きい方よりも 1 段階大きい型のサイズになります(整数サイズの昇格)。例:
UInt8 + UInt16 = UInt32やFloat32 * Float32 = Float64。 - どちらか一方のオペランドが 64 ビット以上の場合、結果型のサイズは 2 つのオペランドのうち大きい方と同じサイズになります。例:
UInt32 + UInt128 = UInt128やFloat32 * Float64 = Float64。 - どちらか一方のオペランドが符号付きである場合、結果型も符号付きになり、そうでない場合は符号なしになります。例:
UInt32 * Int32 = Int64やUInt32 * UInt32 = UInt64。
これらのルールにより、結果型はあらゆる可能な結果を表現できる最小の型になります。これは値域の境界付近でオーバーフローのリスクを伴いますが、64 ビットという最大のネイティブ整数幅を利用して計算を高速に実行できるようにします。この挙動はまた、最大の整数型として 64 ビット整数(BIGINT)を提供する多くの他のデータベースとの互換性も保証します。
例:
オーバーフローは C++ と同様の仕組みで発生します。
abs
導入: v1.1
x の絶対値を計算します。x が符号なし型の場合は結果に影響はありません。x が符号付き型の場合は、符号なしの値を返します。
構文
引数
x— 絶対値を求める対象の値
戻り値
x の絶対値
例
使用例
avg2
導入バージョン: v25.11
指定された引数の平均値を計算して返します。 数値型および時間型をサポートします。
構文
引数
x1, x2]— 平均値を計算するために 2 つの値を受け取ります。
戻り値
指定された引数の平均を計算し、その結果を互換性のある型のうち最大の型に昇格させて返します。
例
数値型
Decimal 型
日付型
DateTime 型
Time64 型
byteSwap
導入バージョン: v23.10
整数のバイト列を逆順にし、すなわちそのエンディアンを変換します。
以下の例は次のようにして導き出せます:
- 10進整数を、ビッグエンディアンでの同等の16進表現に変換する。例: 3351772109 -> C7 C7 FB CD (4バイト)
- バイト列を逆順にする。例: C7 C7 FB CD -> CD FB C7 C7
- 結果をビッグエンディアンとして整数に戻す。例: CD FB C7 C7 -> 3455829959 この関数の代表的なユースケースの 1 つは、IPv4 アドレスのバイト順を反転させることです。
構文
引数
x— 整数値。(U)Int*
戻り値
x のバイト順序を反転した値を返します。(U)Int*
例
使用例
8ビット
16ビット
32ビット
64ビット
divide
導入バージョン: v1.1
2つの値 a と b の商を計算します。結果の型は常に Float64 です。
整数除算は intDiv 関数で提供されます。
0 で割った場合、inf、-inf、または nan を返します。
構文
引数
x— 被除数、y— 除数
戻り値
x を y で割った商
例
2 つの数値の割り算
ゼロ除算
divideDecimal
導入バージョン: v22.12
2つの Decimal 値に対して除算を実行します。結果の値の型は Decimal256 になります。
結果のスケールは、result_scale 引数([0, 76] の範囲の定数 Integer)で明示的に指定できます。指定しない場合、結果のスケールは与えられた引数のスケールの最大値になります。
これらの関数は通常の divide よりもかなり遅く動作します。
精度を厳密に制御する必要がない場合や、高速な計算が必要な場合は、divide の使用を検討してください。
構文
引数
戻り値
指定されたスケールでの除算結果。Decimal256
使用例
例 1
例 2
divideOrNull
導入バージョン: v25.5
divide と同様ですが、0 で除算した場合は NULL を返します。
構文
引数
x— 被除数 -y— 除数
返り値
x を y で割った商、または NULL。
例
ゼロ除算
gcd
導入: v1.1
2 つの値 a と b の最大公約数を返します。
ゼロで除算した場合、または最小の負の値をマイナス 1 で除算した場合には、例外がスローされます。
構文
引数
x— 1番目の整数 -y— 2番目の整数
返り値
x と y の最大公約数。
例
使用例
ifNotFinite
導入バージョン: v20.3
浮動小数点値が有限かどうかを判定します。
三項演算子 を使用して、同様の結果を得ることができます: isFinite(x) ? x : y。
構文
引数
返り値
xが有限ならx。xが有限でない場合はy。
例
使用例
intDiv
導入バージョン: v1.1
2 つの値 x を y で整数除算します。言い換えると、
商を計算し、それを小さい方の整数へ切り捨てます。
結果のビット幅は被除数(1 番目のパラメータ)と同じです。
0 による除算を行った場合、商が被除数の表現可能範囲に収まらない場合、 または最小の負の数を -1 で除算した場合には、例外がスローされます。
構文
引数
x— 左側のオペランド。 -y— 右側のオペランド。
戻り値
x を y で整数除算した結果。
例
2 つの浮動小数点数の整数除算
商が被除数の範囲内に収まりません
intDivOrNull
導入バージョン: v25.5
intDiv と同様ですが、ゼロ除算、または最小負の値をマイナス 1 で除算した場合に NULL を返します。
構文
引数
戻り値
x を y で整数除算した結果、または NULL。
例
0 による整数除算
最小の負の整数をマイナス1で割る
intDivOrZero
導入バージョン: v1.1
intDiv と同様ですが、ゼロ除算または最小の負の整数値をマイナス 1 で除算した場合にゼロを返します。
構文
引数
戻り値
a を b で整数除算した結果、または 0。
例
0 での整数除算
最小の負の値を -1 で割る
isFinite
導入: v1.1
Float32 または Float64 の引数が無限大ではなく、かつ NaN でもない場合に 1 を返し、
それ以外の場合は 0 を返します。
構文
引数
x— 有限かどうかを判定する数値。Float*
戻り値
x が無限大でもなく NaN でもない場合は 1、それ以外は 0。
例
数値が有限かどうかを確認する
isInfinite
導入バージョン: v1.1
Float32 または Float64 型の引数が無限大である場合は 1 を返し、それ以外の場合、この関数は 0 を返します。
NaN の場合も 0 が返されることに注意してください。
構文
引数
x— 無限大かどうかを判定する数値。Float*
戻り値
x が無限大であれば 1、それ以外の場合は 0(NaN を含む)。
例
数値が無限大かどうかを判定する
isNaN
導入: v1.1
Float32 および Float64 型の引数が NaN の場合は 1 を返し、それ以外の場合は 0 を返します。
構文
引数
x—NaNかどうかを判定する対象。Float*
戻り値
NaN の場合は 1、それ以外は 0
例
使用例
lcm
導入バージョン: v1.1
2つの値 x と y の最小公倍数を返します。
ゼロで除算した場合、または最小の負の値を -1 で除算した場合には、例外がスローされます。
構文
引数
返される値
x と y の最小公倍数を返します。(U)Int*
例
使用例
max2
導入バージョン: v21.11
2 つの数値 x と y のうち大きい方の値を返します。
構文
引数
x— 1つ目の値(U)Int8/16/32/64またはFloat*またはDecimaly— 2つ目の値(U)Int8/16/32/64またはFloat*またはDecimal
返り値
x と y のうち、より大きい値を返します。Float64
例
使用例
midpoint
導入バージョン: v25.11
指定された引数の平均値を計算して返します。 数値型および日時型をサポートします。
構文
引数
x1[, x2, ...]— 平均値を計算する対象として、単一または複数の値を受け取ります。
返される値
指定された引数の平均値を返し、その値は互換性のある型のうち最大の型に昇格されます。
例
数値型
Decimal 型
日付型
DateTime 型
Time64 型
min2
導入バージョン: v21.11
2つの数値 x と y のうち、小さい方を返します。
構文
引数
x— 1 番目の値。型は(U)Int8/16/32/64またはFloat*またはDecimaly— 2 番目の値。型は(U)Int8/16/32/64またはFloat*またはDecimal
返り値
x と y のうち小さい方の値を返します。型は Float64 です。
例
使用例
minus
導入バージョン: v1.1
2 つの値 a と b の差を計算します。結果は常に符号付きです。
plus と同様に、日付または日時から整数を減算できます。
さらに、日時同士の減算もサポートされており、その時間差が結果として得られます。
構文
引数
x— 被減数。 -y— 減数。
戻り値
x から y を引いた値
例
2 つの数値を減算する
整数と日付の減算処理
modulo
導入バージョン: v1.1
2つの値 a を b で割った余りを計算します。
両方の入力が整数の場合、結果の型は整数です。入力の一方が浮動小数点数の場合、結果の型は Float64 になります。
余りは C++ と同様に計算されます。負の数に対しては切り捨て除算が使用されます。
0 で割った場合、または最小の負の値を -1 で割った場合には、例外がスローされます。
構文
エイリアス: mod
引数
a— 被除数 -b— 除数(法、モジュロ)
戻り値
a % b の剰余
例
使用例
moduloOrNull
導入: v25.5
a を b で割った余りを計算します。関数 modulo と同様ですが、右側の引数が 0 の場合には moduloOrNull は NULL を返します。
構文
エイリアス: modOrNull
引数
返される値
x を y で割った余り、または除数がゼロのときは null を返します。
例
ゼロ除算時の moduloOrNull
moduloOrZero
導入: v20.3
modulo 関数と同様ですが、除数がゼロの場合に modulo 関数が例外を送出するのとは異なり、この関数は 0 を返します。
構文
引数
戻り値
a % b の余りを返します。除数が 0 の場合は 0 を返します。
例
使用例
multiply
導入バージョン: v1.1
2つの値 x と y の積を計算します。
構文
引数
返り値
x と y の積を返します。
例
2 つの数値の乗算
multiplyDecimal
導入バージョン: v22.12
2 つの Decimal 型の値に対して乗算を実行します。結果の値の型は Decimal256 になります。
結果のスケールは result_scale 引数(範囲 [0, 76] の const Integer)で明示的に指定できます。指定しない場合、結果のスケールは与えられた引数のうち最大のスケールになります。
これらの関数は通常の multiply よりもかなり遅く動作します。
精度を厳密に制御する必要がない、あるいは高速な計算が必要な場合は、multiply の使用を検討してください。
構文
引数
戻り値
指定されたスケールでの乗算結果。型: Decimal256
例
使用例
通常の乗算との違い
Decimal 型のオーバーフロー
negate
導入バージョン: v1.1
引数 x の符号を反転します。結果は常に符号付きです。
構文
引数
x— 負にする値。
戻り値
x に対して -x を返します。
例
使用例
plus
導入バージョン: v1.1
2 つの値 x と y の和を計算します。エイリアス: x + y(演算子)。
整数と日付、または整数と日時を加算できます。前者の演算では日付の日数を増やし、後者の演算では日時の秒数を増やします。
構文
引数
x— 左側のオペランド。 -y— 右側のオペランド。
戻り値
x と y の和を返します。
例
2 つの数値を加算する
整数と日付の加算
positiveModulo
導入バージョン: v22.11
x を y で割ったときの余りを計算します。関数 modulo と似ていますが、positiveModulo は常に非負の数値を返す点が異なります。
構文
別名: positive_modulo, pmod
引数
返り値
x 以下で y で割り切れる最も近い整数を x から引いた値を返します。
例
使用例
positiveModuloOrNull
導入バージョン: v25.5
a を b で割ったときの余りを計算します。関数 positiveModulo と似ていますが、第2引数が 0 の場合には positiveModuloOrNull は NULL を返します。
構文
別名: positive_modulo_or_null, pmodOrNull
引数
x— 被除数。(U)Int*/Float32/64.y— 除数(法)。(U)Int*/Float32/64.
戻り値
x を y で割り切れる x 以下の最も近い整数まで切り下げ、その値との差を返します。除数が 0 の場合は null を返します。
例
positiveModuloOrNull