★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.3. 算術関数と演算子 #

PostgreSQLの数多くの型に対する算術演算子が用意されています。 標準算術表現法が存在しない型(例えば、日付/時刻データ型)については、後続する節で実際の動作を説明します。

表 9.4は標準の数値型で使用可能な算術演算子を示しています。 特に説明がない限り、numeric_typeを受け付けると表示されている演算子はすべてのsmallintintegerbigintnumericrealdouble precisionデータ型で利用可能です。 integral_typeを受け付けると表示されている演算子はすべてのsmallintintegerbigintデータ型で利用可能です。 特に説明がない限り、それぞれの演算子は引数と同じデータ型を返します。 integer + numericのように、複数の引数データ型が使われる呼び出しは、このリストの後で現れる型を使って解決されます。

表9.4 算術演算子

演算子

説明

numeric_type + numeric_typenumeric_type

2 + 35

+ numeric_typenumeric_type

単項和(演算なし)

+ 3.53.5

numeric_type - numeric_typenumeric_type

2 - 3-1

- numeric_typenumeric_type

否定

- (-4)4

numeric_type * numeric_typenumeric_type

2 * 36

numeric_type / numeric_typenumeric_type

商(整数型では、除算によってゼロへ余りが切り捨てられます)

5.0 / 22.5000000000000000

5 / 22

(-5) / 2-2

numeric_type % numeric_typenumeric_type

剰余(余り)。smallintintegerbigintnumericで利用可能

5 % 41

numeric ^ numericnumeric

double precision ^ double precisiondouble precision

累乗

2 ^ 38

典型的な数学的用法とは違って、デフォルトでは^は左から右に適用されます。

2 ^ 3 ^ 3512

2 ^ (3 ^ 3)134217728

|/ double precisiondouble precision

平方根

|/ 25.05

||/ double precisiondouble precision

立方根

||/ 64.04

@ numeric_typenumeric_type

絶対値

@ -5.05.0

integral_type & integral_typeintegral_type

ビットごとのAND

91 & 1511

integral_type | integral_typeintegral_type

ビットごとのOR

32 | 335

integral_type # integral_typeintegral_type

ビットごとの排他的論理和

17 # 520

~ integral_typeintegral_type

ビットごとのNOT

~1-2

integral_type << integerintegral_type

ビットごとの左シフト

1 << 416

integral_type >> integerintegral_type

ビットごとの右シフト

8 >> 22


表 9.5に使用可能な算術関数を示します。 これら関数の多くは、異なる引数型を持つ複数の形で提供されています。 特に記述がある場合を除き、すべての形式の関数はその引数と同じデータ型を返します。 複数の型をまたがる場合は上記の演算子のところで説明したのと同じ方法で解決されます。 double precisionデータに対する関数のほとんどはホストシステムのCライブラリの上層に実装されています。このため、精度と境界近くの場合の振舞いはホストシステムに依存して変わります。

表9.5 算術関数

関数

説明

abs ( numeric_type ) → numeric_type

絶対値

abs(-17.4)17.4

cbrt ( double precision ) → double precision

立方根

cbrt(64.0)4

ceil ( numeric ) → numeric

ceil ( double precision ) → double precision

引数より大きいか等しく、引数に最も近い整数

ceil(42.2)43

ceil(-42.8)-42

ceiling ( numeric ) → numeric

ceiling ( double precision ) → double precision

引数より大きいか等しく、引数に最も近い整数(ceilと同じ)

ceiling(95.3)96

degrees ( double precision ) → double precision

ラディアンを度に変換

degrees(0.5)28.64788975654116

div ( y numeric, x numeric ) → numeric

y/xの整数商 (0に向かって切り捨て)

div(9, 4)2

erf ( double precision ) → double precision

誤差関数

erf(1.0)0.8427007929497149

erfc ( double precision ) → double precision

相補誤差関数(1-erf(x)、大きな入力における精度の損失なし)

erfc(1.0)0.15729920705028513

exp ( numeric ) → numeric

exp ( double precision ) → double precision

指数(eを底とする指定のべき乗)

exp(1.0)2.7182818284590452

factorial ( bigint ) → numeric

階乗

factorial(5)120

floor ( numeric ) → numeric

floor ( double precision ) → double precision

引数より小さいか等しく、引数に最も近い整数

floor(42.8)42

floor(-42.8)-43

gcd ( numeric_type, numeric_type ) → numeric_type

最大公約数(余りなく入力を割る最大の正の整数)。 両方の入力が0なら0を返す。 integerbigintnumericで利用可能

gcd(1071, 462)21

lcm ( numeric_type, numeric_type ) → numeric_type

最小公倍数(両方の入力の整数倍となる最小の厳密な正の数)。 両方の入力が0なら0を返す。 integerbigintnumericで利用可能

lcm(1071, 462)23562

ln ( numeric ) → numeric

ln ( double precision ) → double precision

自然対数

ln(2.0)0.6931471805599453

log ( numeric ) → numeric

log ( double precision ) → double precision

10を底とした対数

log(100)2

log10 ( numeric ) → numeric

log10 ( double precision ) → double precision

10を底とした対数(logと同じ)

log10(1000)3

log ( b numeric, x numeric ) → numeric

bを底としたxの対数

log(2.0, 64.0)6.0000000000000000

min_scale ( numeric ) → integer

与えられた値を正確に表現するのに必要な最小の桁数(小数点以下の10進の桁数)

min_scale(8.4100)2

mod ( y numeric_type, x numeric_type ) → numeric_type

y/xの剰余。 smallintintegerbigintnumericで利用可能

mod(9, 4)1

pi ( ) → double precision

πの近似値

pi()3.141592653589793

power ( a numeric, b numeric ) → numeric

power ( a double precision, b double precision ) → double precision

ab

power(9, 3)729

radians ( double precision ) → double precision

度をラディアンに変換

radians(45.0)0.7853981633974483

round ( numeric ) → numeric

round ( double precision ) → double precision

最も近い整数へ丸めます。 numericの場合、小数点以下を四捨五入します。 double precisionでは端数処理の振る舞いはプラットフォーム依存です。 しかし、最も普通の規則は最近接偶数への丸め(round to nearest even)です。

round(42.4)42

round ( v numeric, s integer ) → numeric

vを小数点第s位まで丸めます。 小数点以下を切り上げて端数を処理します。

round(42.4382, 2)42.44

round(1234.56, -1)1230

scale ( numeric ) → integer

引数の位取り(小数点以下の10進の桁数)

scale(8.4100)4

sign ( numeric ) → numeric

sign ( double precision ) → double precision

引数の符号(-1, 0,あるいは +1)

sign(-8.4)-1

sqrt ( numeric ) → numeric

sqrt ( double precision ) → double precision

平方根

sqrt(2)1.4142135623730951

trim_scale ( numeric ) → numeric

後方のゼロを削除することにより値の桁数(小数点以下の10進桁数)を減じる

trim_scale(8.4100)8.41

trunc ( numeric ) → numeric

trunc ( double precision ) → double precision

整数へ切り捨て(ゼロに向かって)

trunc(42.8)42

trunc(-42.8)-42

trunc ( v numeric, s integer ) → numeric

vを小数点以下s桁で切り捨て

trunc(42.4382, 2)42.43

width_bucket ( operand numeric, low numeric, high numeric, count integer ) → integer

width_bucket ( operand double precision, low double precision, high double precision, count integer ) → integer

lowからhighまでの範囲に広がる等幅でバケット数countのヒストグラムにおいて、operandが割り当てられるバケット番号を返す。 範囲外の入力値に対しては0またはcount+1を返す。

width_bucket(5.35, 0.024, 10.06, 5)3

width_bucket ( operand anycompatible, thresholds anycompatiblearray ) → integer

バケットの最小値を示す配列が与えられた時に、operandが割り当てられるバケット番号を返す。 最初の最小値よりも小さい入力値に対しては0を返す。 operandと配列要素は標準の比較演算子を持つ型であればどのような型でも構いません。 thresholds配列はソートされていなければならず、小さいものが最初です。 さもなければ予想外の結果となるでしょう。

width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[])2


表 9.6に乱数を生成する関数を示します。

表9.6 乱数関数

関数

説明

random ( ) → double precision

0.0 <= x < 1.0の範囲の乱数値を返す

random()0.897124072839091

random_normal ( [ mean double precision [, stddev double precision ]] ) → double precision

指定されたパラメータを使用した標準偏差での乱数値を返します。 meanのデフォルト値は0.0、stddevのデフォルト値は1.0です。

random_normal(0.0, 1.0)0.051285419

setseed ( double precision ) → void

今後のrandom()random_normal()呼び出しで使用されるシード(種)を設定します。引数は-1.0から1.0までの境界を含む値でなければなりません。

setseed(0.12345)


random()関数は決定論的疑似乱数発生器を使用しています。 高速ですが、暗号用途には適していません。より安全な代替物としてpgcryptoモジュールを参照してください。 setseed()が呼び出されると、現在のセッション内での以後の一連のrandom()の呼び出し結果はsetseed()を同じ引数で再実行することによって再現可能となります。 同じセッション内でsetseed()をそれ以前に呼び出していない場合は、最初のrandom()の呼び出しによってプラットフォーム依存の乱数ビットのソースからシードを入手します。 これらの注意点はrandom_normal()にも適用されます。

使用可能な三角関数を表 9.7に示します。 それぞれの三角関数には、角度の単位をラディアンにするものと度にするものの2種類があります。

表9.7 三角関数

関数

説明

acos ( double precision ) → double precision

逆余弦関数、結果はラディアン

acos(1)0

acosd ( double precision ) → double precision

逆余弦関数、結果は度

acosd(0.5)60

asin ( double precision ) → double precision

逆正弦関数、結果はラディアン

asin(1)1.5707963267948966

asind ( double precision ) → double precision

逆正弦関数、結果は度

asind(0.5)30

atan ( double precision ) → double precision

逆正接関数、結果はラディアン

atan(1)0.7853981633974483

atand ( double precision ) → double precision

逆正接関数、結果は度

atand(1)45

atan2 ( y double precision, x double precision ) → double precision

y/xの逆正接関数、結果はラディアン

atan2(1, 0)1.5707963267948966

atan2d ( y double precision, x double precision ) → double precision

y/xの逆正接関数、結果は度

atan2d(1, 0)90

cos ( double precision ) → double precision

余弦関数、引数はラディアン

cos(0)1

cosd ( double precision ) → double precision

余弦関数、引数は度

cosd(60)0.5

cot ( double precision ) → double precision

余接関数、引数はラディアン

cot(0.5)1.830487721712452

cotd ( double precision ) → double precision

余接関数、引数は度

cotd(45)1

sin ( double precision ) → double precision

正弦関数、結果はラディアン

sin(1)0.8414709848078965

sind ( double precision ) → double precision

正弦関数、結果は度

sind(30)0.5

tan ( double precision ) → double precision

正接関数、引数はラディアン

tan(1)1.5574077246549023

tand ( double precision ) → double precision

正接関数、引数は度

tand(45)1


注記

度単位の角度を扱う別の方法は、前に示した単位変換関数radians()degrees()を使うことです。 しかし、角度を使う方法の方が、sind(30)のような特別な場合の丸め誤差を避けられるため、推奨されます。

表 9.8に利用可能な双曲線関数を示します。

表9.8 双曲線関数

関数

説明

sinh ( double precision ) → double precision

双曲線正弦

sinh(1)1.1752011936438014

cosh ( double precision ) → double precision

双曲線余弦

cosh(0)1

tanh ( double precision ) → double precision

双曲線正接

tanh(1)0.7615941559557649

asinh ( double precision ) → double precision

逆双曲線正弦

asinh(1)0.881373587019543

acosh ( double precision ) → double precision

逆双曲線余弦

acosh(1)0

atanh ( double precision ) → double precision

逆双曲線正接

atanh(0.5)0.5493061443340548