支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本: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 / 7.1

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

按位与

91 & 1511

integral_type | integral_typeintegral_type

按位或

32 | 335

integral_type # integral_typeintegral_type

按位异或

17 # 520

~ integral_typeintegral_type

按位非

~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 的整数商(向零截断)

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;适用于 integerbigintnumeric 类型

gcd(1071, 462)21

lcm ( numeric_type, numeric_type ) → numeric_type

最小公倍数(能同时整除两个输入的最小正数);如果任一输入为零,则返回 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

精确表示所提供的值所需的最小刻度(小数位数)

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(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

参数的刻度(小数部分中的十进制位数)

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

通过删除尾随零来减小值的刻度(小数位数)

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

返回直方图中 operand 所在的桶的编号,该直方图具有 count 个等宽的桶,范围从 lowhigh。 对于该范围之外的输入,返回 0count+1

width_bucket(5.35, 0.024, 10.06, 5)3

width_bucket ( operand anycompatible, thresholds anycompatiblearray ) → integer

返回 operand 所在的桶的编号,给定一个列出桶的下限的数组。 对于小于第一个下限的输入,返回 0operand 和数组元素可以是任何具有标准比较运算符的类型。 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 ( min integer, max integer ) → integer

random ( min bigint, max bigint ) → bigint

random ( min numeric, max numeric ) → numeric

返回一个在 min <= x <= max 范围内的随机值。对于 numeric 类型,结果将具有与 minmax 中小数位数较多者相同的小数位数。

random(1, 10)7

random(-0.499, 0.499)0.347

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 之间(包括 -1.0 和 1.0)。

setseed(0.12345)


random()random_normal() 函数(在表 9.6中列出)使用确定性的伪随机数生成器。它速度很快,但不适用于密码学应用;请参阅 pgcrypto 模块以获得更安全的替代方案。如果调用了 setseed(),则可以通过使用相同的参数重新调用 setseed() 来重复当前会话中后续调用这些函数的结果序列。在同一会话中没有任何先前的 setseed() 调用时,首次调用这些函数中的任何一个都会从平台相关的随机位源获取种子。

表 9.7 显示了可用的三角函数。这些函数中的每一个都有两个变体,一个以弧度为单位测量角度,另一个以度为单位测量角度。

表 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


提交更正

如果您在文档中发现任何不正确的内容,或者与您使用特定功能的经验不符,或者需要进一步澄清,请使用此表格报告文档问题。