Postgresql 中文操作指南
9.3. Mathematical Functions and Operators #
为 PostgreSQL 的许多类型提供了数学运算符。对于没有标准数学约定的类型(例如日期/时间类型),我们将在后面的部分中描述实际行为。
Table 9.4 显示了标准数字类型可用的数学运算符。除非另有说明,否则标为接受 numeric_type 的运算符适用于所有类型 smallint、integer、bigint、numeric、real 和 double precision。标为接受 integral_type 的运算符适用于类型 smallint、integer 和 bigint。除非另有说明,运算符的每种形式返回与它的参数相同的数据类型。涉及多个参数数据类型的调用(例如 integer + numeric)通过使用出现在这些列表中较后的类型来解析。
Table 9.4. Mathematical Operators
Operator Description Example(s) |
numeric_type + numeric_type → numeric_type 加法 2 + 3 → 5 |
+ numeric_type → numeric_type 一元正号(无操作) + 3.5 → 3.5 |
numeric_type - numeric_type → numeric_type 减法 2 - 3 → -1 |
- numeric_type → numeric_type 否定 - (-4) → 4 |
numeric_type * numeric_type → numeric_type 乘法 2 * 3 → 6 |
numeric_type / numeric_type → numeric_type 除法(对于整数类型,除法将结果截断为零) 5.0 / 2 → 2.5000000000000000 5 / 2 → 2 (-5) / 2 → -2 |
numeric_type % numeric_type → numeric_type 模(余数);适用于 smallint 、 integer 、 bigint 和 numeric 5 % 4 → 1 |
numeric ^ numeric → numeric double precision ^ double precision → double precision 指数 2 ^ 3 → 8 与典型的数学运算不同,多次使用 ^ 将默认从左到右关联: 2 ^ 3 ^ 3 → 512 2 ^ (3 ^ 3) → 134217728 |
_ |
/_ double precision → double precision 平方根_ |
/ 25.0_ → 5 |
_ |
/_ double precision → double precision 立方根_ |
/ 64.0_ → 4 |
@ numeric_type → numeric_type 绝对值 @ -5.0 → 5.0 |
integral_type & integral_type → integral_type 按位与 91 & 15 → 11 |
integral_type _ |
_ integral_type → integral_type 按位或_32 |
3_ → 35 |
integral_type # integral_type → integral_type 按位异或 17 # 5 → 20 |
~ integral_type → integral_type 按位非 ~1 → -2 |
integral_type << integer → integral_type 按位左移 1 << 4 → 16 |
integral_type >> integer → integral_type 按位右移 8 >> 2 → 2 |
Table 9.5 显示了可用的数学函数。其中许多函数以具有不同参数类型的多种形式提供。除非另有说明,函数的任何给定形式返回与它的参数相同的数据类型;交叉类型的情况以与上面运算符中解释相同的方式解决。处理 double precision 数据的函数大多在主机系统的 C 库之上实现;因此,准确性和边界情况的行为可能因主机系统而异。
Table 9.5. Mathematical Functions
Function Description Example(s) |
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 互补误差函数(对于大的输入没有精度损失) 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 ;适用于 integer 、 bigint 和 numeric gcd(1071, 462) → 21 |
lcm ( numeric_type , numeric_type ) → numeric_type 最小公倍数(能同时被两个输入整除的最小的严格正数);如果任何一个输入为零,则返回 0 ;适用于 integer 、 bigint 和 numeric 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 的余数;适用于 smallint 、 integer 、 bigint 和 numeric 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 a 乘方为 b 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 个等宽桶跨越从 low 到 high 的范围。如果输入不在该范围内,则返回 0 或 _count +1_。 width_bucket(5.35, 0.024, 10.06, 5) → 3 |
width_bucket ( operand anycompatible , thresholds anycompatiblearray ) → integer 给出列出桶的下限的数组,返回 operand 所在的桶编号。如果输入小于第一个下限,则返回 0 。 operand 和数组元素可以是具有标准比较运算符的任何类型。 thresholds 数组 must be sorted 、首先是最小的,否则将获取意外的结果。 width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]) → 2 |
Table 9.6 显示了用于生成随机数的函数。
Table 9.6. Random Functions
Function Description Example(s) |
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(),则通过使用相同的参数重新发出 setseed(),可以在当前会话中重复后续 random() 调用的结果系列。在同一次会话中没有任何先前的 setseed() 调用时,第一个 random() 调用从一个平台相关的随机比特源中获取一个种子。这些说明同样适用于 random_normal()。
Table 9.7 显示了可用的三角函数。每个函数有两个变体,一个以弧度测量角度,另一个以度数测量角度。
Table 9.7. Trigonometric Functions
Function Description Example(s) |
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 |
Note
处理以度为单位测量的角度的另一种方法是使用前面所示的单位转换函数 radians() 和 degrees()。但是,更倾向于使用基于度的三角函数,因为这样可以避免 sind(30) 等特殊情况的舍入误差。
Table 9.8 显示了可用的双曲函数。
Table 9.8. Hyperbolic Functions
Function Description Example(s) |
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 |