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

算術関数

算術関数は UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, または Float64 の任意の2つのオペランドに対して動作します。

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

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

これらのルールは、結果の型がすべての可能な結果を表すことができる最小の型になることを保証します。このことは、値の範囲の境界付近でのオーバーフローのリスクを引き起こしますが、64ビットの最大ネイティブ整数幅を使用して計算が迅速に行われることを保証します。この動作は、64ビット整数(BIGINT)を最大の整数型として提供する多くの他のデータベースとの互換性も保証します。

例:

オーバーフローはC++と同様に発生します。

plus

2つの値 ab の合計を計算します。

構文

整数と日付、または日時を持つ日付を加算することが可能です。前者の操作は日付の曜日数を増加させ、後者の操作は日時の日付の秒数を増加させます。

エイリアス: a + b(演算子)

minus

2つの値 ab の差を計算します。結果は常に符号付きです。

plus と同様に、整数を日付または日時から減算することが可能です。

さらに、日時間の減算もサポートされており、それにより2つの日時間の時間差が結果として得られます。

構文

エイリアス: a - b(演算子)

multiply

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

構文

エイリアス: a * b(演算子)

divide

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

0による除算は inf, -inf, または nan を返します。

構文

エイリアス: a / b(演算子)

intDiv

2つの値 ab で整数除算します。すなわち、商を次の最小整数に切り下げて計算します。

結果は被除数(最初のパラメータ)と同じ幅を持ちます。

ゼロでの除算や商が被除数の範囲に収まらない場合、または最小の負の数をマイナス1で除算する場合に例外が発生します。

構文

クエリ:

intDivOrZero

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

構文

isFinite

Float32 または Float64 の引数が有限であり、無限でも NaN でない場合、1を返します。そうでない場合、この関数は0を返します。

構文

isInfinite

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

構文

ifNotFinite

浮動小数点値が有限かどうかをチェックします。

構文

引数

  • x — 無限のチェック対象の値。 Float*
  • y — フォールバック値。 Float*

返される値

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

両方の入力が整数の場合、結果の型は整数です。いずれかの入力が浮動小数点数である場合、結果の型は 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つの値 ab の最大公約数を返します。

ゼロで除算する場合や最小の負の数をマイナス1で除算する場合には例外が発生します。

構文

lcm(a, b)

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

ゼロで除算する場合や最小の負の数をマイナス1で除算する場合には例外が発生します。

構文

max2

2つの値 ab のうち、大きい方を返します。返される値の型は Float64 です。

構文

クエリ:

結果:

min2

2つの値 ab のうち、小さい方を返します。返される値の型は Float64 です。

構文

クエリ:

結果:

multiplyDecimal

2つの10進数 a および b を乗算します。結果の値は Decimal256 型になります。

結果のスケールは result_scale によって明示的に指定できます。result_scale が指定されていない場合は、入力値の最大スケールとみなされます。

この関数は通常の multiply よりもかなり遅く動作します。結果の精度に対する制御が不要な場合、または迅速な計算が望まれる場合は、multiply の使用を検討してください。

構文

引数

  • a — 最初の値。 Decimal
  • b — 2番目の値。 Decimal
  • result_scale — 結果のスケール。 Int/UInt

返される値

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

通常の乗算との違い:

結果:

結果:

divideDecimal

2つの10進数 a および b を除算します。結果の値は Decimal256 型になります。

結果のスケールは result_scale によって明示的に指定できます。result_scale が指定されていない場合は、入力値の最大スケールとみなされます。

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

構文

引数

  • a — 最初の値: Decimal
  • b — 2番目の値: Decimal
  • result_scale — 結果のスケール: Int/UInt

返される値

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

通常の除算との違い:

結果:

結果:

byteSwap

整数のバイトを逆転させます。すなわち、そのエンディアンを変更します。

構文

結果:

上記の例は以下のように計算できます:

  1. 10進数の整数を10進数の形式からビッグエンディアン形式に変換します。すなわち、3351772109 -> C7 C7 FB CD(4バイト)
  2. バイトを逆転させます。すなわち、C7 C7 FB CD -> CD FB C7 C7
  3. 結果をビッグエンディアンとして整数に戻します。すなわち、CD FB C7 C7 -> 3455829959

この関数の使用例の一つは、IPv4の逆転です: