PostgreSQL为很多类型提供了数学操作符。对于那些没有标准数学表达的类型(如日期/时间类型),我们将在后续小节中描述实际的行为。
表 9.4 显示了可用于标准数字类型的数学操作符。.
除非另有说明, 显示为可接受 numeric_type
的操作符对所有的 smallint
、integer
、bigint
、numeric
、real
和 double precision
类型都可用。
显示为可接受 integral_type
的操作符对 smallint
、integer
和 bigint
类型是可用的。
除了特别说明之处,操作符的每种形式都返回与其参数相同的数据类型。
涉及多个参数数据类型的调用, 例如 integer
+
numeric
,可通过使用这些列表中稍后出现的类型来解析。
表 9.4. 数学操作符
操作符 描述 例子 |
---|
加
|
一元加(无操作)
|
减
|
否定
|
乘
|
除(对于整型,除法将结果截断为零)
|
模(取余); 适用于
|
指数 (不像典型的数学实践, 多次使用
|
平方根
|
立方根
|
阶乘(已弃用, 使用
|
阶乘作为前缀操作符(已弃用, 使用
|
绝对值
|
按位与(AND)
|
按位或(OR)
|
按位异或(exclusive OR)
|
按位求反(NOT)
|
按位左移
|
按位右移
|
表 9.5 显示了可用的数学函数。
许多这样的函数以多种具有不同的参数类型的形式提供。
除非注明,任何给定形式的函数都返回与其参数相同的数据类型;跨类型情况的解决方法与上述对操作符的解释相同。
使用double precision
数据的函数大多是在主机系统的C库上实现的;
因此,边界情况下的准确性和行为会因主机系统的区别而不同。
表 9.5. 数学函数
表 9.6展示了用于产生随机数的函数。
表 9.6. 随机函数
random()
函数使用了一个简单的线性共轭算法。
它的速度很快,但不适合于密码学应用;关于更安全的替代方案,请参阅 pgcrypto模块。
如果setseed()
被调用,那么当前会话中的一系列后续random()
调用的结果能够通过使用相同的参数重新发布setseed()
来重复。
表 9.7显示了可用的三角函数。 每一种这样的函数都有两个变体,一个以弧度度量角,另一个以角度度量角。
表 9.7. 三角函数
另一种使用以角度度量的角的方法是使用早前展示的单位转换函数
和radians()
。不过,使用基于角度的三角函数更好,因为这类方法能避免degrees()
sind(30)
等特殊情况下的舍入偏差。
表 9.8显示的是可用的双曲函数。
表 9.8. 双曲函数