算術関数
算術関数は UInt8
, UInt16
, UInt32
, UInt64
, Int8
, Int16
, Int32
, Int64
, Float32
, または Float64
の任意の2つのオペランドに対して動作します。
演算を行う前に、両方のオペランドは結果の型にキャストされます。結果の型は以下のように決定されます(以下の関数ドキュメントで異なる指定がされていない限り):
- 両方のオペランドが32ビット以下の場合、結果の型のサイズは、2つのオペランドのうちの大きい方に続く次の大きい型のサイズになります(整数サイズの昇格)。たとえば、
UInt8 + UInt16 = UInt32
やFloat32 * Float32 = Float64
のようになります。 - いずれかのオペランドが64ビット以上の場合、結果の型のサイズは2つのオペランドのうちの大きい方と同じサイズになります。たとえば、
UInt32 + UInt128 = UInt128
やFloat32 * Float64 = Float64
のようになります。 - いずれかのオペランドが符号付きの場合、結果の型も符号付きになります。そうでない場合は符号なしになります。たとえば、
UInt32 * Int32 = Int64
のようになります。
これらのルールは、結果の型がすべての可能な結果を表すことができる最小の型になることを保証します。このことは、値の範囲の境界付近でのオーバーフローのリスクを引き起こしますが、64ビットの最大ネイティブ整数幅を使用して計算が迅速に行われることを保証します。この動作は、64ビット整数(BIGINT)を最大の整数型として提供する多くの他のデータベースとの互換性も保証します。
例:
オーバーフローはC++と同様に発生します。
plus
2つの値 a
と b
の合計を計算します。
構文
整数と日付、または日時を持つ日付を加算することが可能です。前者の操作は日付の曜日数を増加させ、後者の操作は日時の日付の秒数を増加させます。
エイリアス: a + b
(演算子)
minus
2つの値 a
と b
の差を計算します。結果は常に符号付きです。
plus
と同様に、整数を日付または日時から減算することが可能です。
さらに、日時間の減算もサポートされており、それにより2つの日時間の時間差が結果として得られます。
構文
エイリアス: a - b
(演算子)
multiply
2つの値 a
と b
の積を計算します。
構文
エイリアス: a * b
(演算子)
divide
2つの値 a
と b
の商を計算します。結果の型は常に Float64 です。整数の除算は intDiv
関数によって提供されます。
0による除算は inf
, -inf
, または nan
を返します。
構文
エイリアス: a / b
(演算子)
intDiv
2つの値 a
を b
で整数除算します。すなわち、商を次の最小整数に切り下げて計算します。
結果は被除数(最初のパラメータ)と同じ幅を持ちます。
ゼロでの除算や商が被除数の範囲に収まらない場合、または最小の負の数をマイナス1で除算する場合に例外が発生します。
構文
例
クエリ:
intDivOrZero
intDiv
と同様ですが、ゼロで除算する場合や最小の負の数をマイナス1で除算する場合にはゼロを返します。
構文
isFinite
Float32 または Float64 の引数が有限であり、無限でも NaN でない場合、1を返します。そうでない場合、この関数は0を返します。
構文
isInfinite
Float32 または Float64 の引数が無限である場合に1を返します。そうでない場合、この関数は0を返します。NaNの場合は0が返されることに注意してください。
構文
ifNotFinite
浮動小数点値が有限かどうかをチェックします。
構文
引数
返される値
x
が有限の場合はx
。x
が有限でない場合はy
です。
例
クエリ:
SELECT 1/0 as infimum, ifNotFinite(infimum,42)
結果:
┌─infimum─┬─ifNotFinite(divide(1, 0), 42)─┐ │ inf │ 42 │ └─────────┴───────────────────────────────┘
同様の結果を得るには、三項演算子を使用することができます: isFinite(x) ? x : y
。
isNaN
Float32 と Float64 の引数が NaN の場合に1を返します。そうでない場合、この関数は0を返します。
構文
modulo
2つの値 a
を b
で除算した余りを計算します。
両方の入力が整数の場合、結果の型は整数です。いずれかの入力が浮動小数点数である場合、結果の型は Float64 になります。
余りはC++のように計算されます。負の数については切り捨て除算が使用されます。
ゼロで除算する場合や最小の負の数をマイナス1で除算する場合には例外が発生します。
構文
エイリアス: a % b
(演算子)
moduloOrZero
modulo のように動作しますが、除数がゼロの場合はゼロを返します。
構文
positiveModulo(a, b)
modulo のように動作しますが、常に非負の数を返します。
この関数は modulo
よりも4-5倍遅くなります。
構文
エイリアス:
positive_modulo(a, b)
pmod(a, b)
例
クエリ:
結果:
negate
値 a
を否定します。結果は常に符号付きです。
構文
エイリアス: -a
abs
a
の絶対値を計算します。a
が符号なし型である場合には影響を与えません。a
が符号付き型である場合、符号なしの数を返します。
構文
gcd
2つの値 a
と b
の最大公約数を返します。
ゼロで除算する場合や最小の負の数をマイナス1で除算する場合には例外が発生します。
構文
lcm(a, b)
2つの値 a
と b
の最小公倍数を返します。
ゼロで除算する場合や最小の負の数をマイナス1で除算する場合には例外が発生します。
構文
max2
2つの値 a
と b
のうち、大きい方を返します。返される値の型は Float64 です。
構文
例
クエリ:
結果:
min2
2つの値 a
と b
のうち、小さい方を返します。返される値の型は Float64 です。
構文
例
クエリ:
結果:
multiplyDecimal
2つの10進数 a
および b
を乗算します。結果の値は Decimal256 型になります。
結果のスケールは result_scale
によって明示的に指定できます。result_scale
が指定されていない場合は、入力値の最大スケールとみなされます。
この関数は通常の multiply
よりもかなり遅く動作します。結果の精度に対する制御が不要な場合、または迅速な計算が望まれる場合は、multiply
の使用を検討してください。
構文
引数
返される値
- 指定されたスケールの乗算結果。 Decimal256。
例
通常の乗算との違い:
結果:
結果:
divideDecimal
2つの10進数 a
および b
を除算します。結果の値は Decimal256 型になります。
結果のスケールは result_scale
によって明示的に指定できます。result_scale
が指定されていない場合は、入力値の最大スケールとみなされます。
この関数は通常の divide
よりもかなり遅く動作します。結果の精度に対する制御が不要な場合、または迅速な計算が望まれる場合は、divide
の使用を検討してください。
構文
引数
返される値
- 指定されたスケールでの除算結果。 Decimal256。
例
通常の除算との違い:
結果:
結果:
byteSwap
整数のバイトを逆転させます。すなわち、そのエンディアンを変更します。
構文
例
結果:
上記の例は以下のように計算できます:
- 10進数の整数を10進数の形式からビッグエンディアン形式に変換します。すなわち、3351772109 -> C7 C7 FB CD(4バイト)
- バイトを逆転させます。すなわち、C7 C7 FB CD -> CD FB C7 C7
- 結果をビッグエンディアンとして整数に戻します。すなわち、CD FB C7 C7 -> 3455829959
この関数の使用例の一つは、IPv4の逆転です: