跳转至

数学函数和操作符

数学函数和操作符

SeaboxMPP数据库为很多类型提供了数学操作符。对于那些没有标准数学表达的类型(如日期/时间类型),我们将在后续小节中描述实际的行为。

下表"表 数学操作符"展示了所有可用的数学操作符。

表 数学操作符

操作符 描述 例子 结果
+ 2 + 3 5
- 2 - 3 -1
* 2 * 3 6
/ 除(整数除法截断结果) 4 / 2 2
% 模(取余) 5 % 4 1
^ 指数(从左至右结合) 2.0 ^ 3.0 8
\|/ 平方根 \|/ 25.0 5
\|\|/ 立方根 \|\|/ 27.0 3
! 阶乘 5 ! 120
!! 阶乘(前缀操作符) !! 5 120
@ 绝对值 @ -5.0 5
& 按位与 91 & 15 11
\| 按位或 32 \| 3 35
# 按位异或 17 # 5 20
~ 按位求反 ~1 -2
<< 按位左移 1 << 4 16
>> 按位右移 8 >> 2 2

按位操作操作符只能用于整数数据类型,而其它的操作符可以用于全部数字数据类型。按位操作的操作符还可以用于位串类型bitbit varying,如"位串操作符"所示。

数学函数

下文显示了可用的数学函数。在该表中,dp表示double precision。这些函数中有许多都有多种不同的形式,区别是参数不同。除非特别指明,任何特定形式的函数都返回和它的参数相同的数据类型。

处理double precision数据的函数大多数是在宿主系统的 C库基础上实现的;因此,边界情况下的准确度和行为是根据宿主系统而变化的。

以下函数也包括三角函数,所有三角函数都有类型为double precision的参数和返回类型。每一种三角函数都有两个变体,一个以弧度度量角,另一个以角度度量角。

abs()
语法
abs(x)
返回类型
和输入相同
描述
绝对值
示例
``` sql seaboxsql=# select abs(-17.4); abs
17.4 (1 row) ```
acos()/acosd()
语法
acos(dp),acosd(dp)
描述
反余弦,参数取值范围为[-1,1], 其中acosd返回度数, acos返回弧度
示例

``` sql seaboxsql=# select acos(-1); acos


3.141592653589793 (1 row)

seaboxsql=# select acosd(-1); acosd


180 (1 row) ```

asin()/asind()
语法
asin(dp),asind(dp)
描述
反正弦, 参数取值范围为[-1,1], 其中asind返回度数, asin返回弧度
示例

``` sql seaboxsql=# select asind(-1); asind


-90 (1 row)

seaboxsql=# select asin(-1); asin


-1.5707963267948966 (1 row) ```

atan()/atand()
语法
atan(dp),atand(dp)
描述
反正切, 参数取值范围为正负无穷大, 其中atand返回度数, atan返回弧度,结果取值范围为(-90,90)[-pi/2,pi/2]
示例

``` sql seaboxsql=# select atand(1000000000); atand


89.99999994270424 (1 row)

seaboxsql=# select atan(-1000000000); atan


-1.5707963257948967 (1 row) ```

atan2()/atan2d()
语法
atan2(dp,dp),atan2d(dp,dp)
描述
参数1除以参数2的反正切, 其中atan2d返回度数, atan2返回弧度,结果取值范围为(-90,90)[-pi/2,pi/2]
示例

``` sql seaboxsql=# select atan2(-1000000000,100); atan2


-1.5707962267948967 (1 row)

seaboxsql=# select atan2d(-1000000000,100); atan2d


-89.99999427042206 (1 row) ```

cbrt()
语法
cbrt(dp)
返回类型
dp
描述
立方根
示例
``` sql seaboxsql=# select cbrt(27.0); cbrt
3.0000000000000004 (1 row) ```
ceil()/ceiling()
语法
ceiling(dp or numeric), ceil(dp or numeric)
返回类型
和输入相同
描述
不小于参数的最近的整数
示例
``` sql seaboxsql=# select ceil(-42.8); ceil
-42 (1 row) seaboxsql=# select ceiling(-95.3); ceiling

-95 (1 row) ```

cos()/cosd()
语法
cos(dp),cosd(dp)
描述
余弦, 其中cos参数为度数, cosd参数为弧度,结果取值范围为[-1,1]
示例
``` sql seaboxsql=# select cos(-pi()); cos
-1 (1 row) seaboxsql=# select cosd(0); cosd

1 (1 row) ```

cot()/cotd()
语法
cot(dp),cotd(dp)
描述
余切, 其中cot参数为度数, cotd参数为弧度
示例
``` sql seaboxsql=# select cot(pi()/4); cot
1.0000000000000002 (1 row) seaboxsql=# select cotd(45); cotd

1 (1 row) ```

degrees()
语法
degrees(dp)
返回类型
dp
描述
把弧度转为角度
示例
``` sql seaboxsql=# select degrees(0.5); degrees
28.64788975654116 (1 row) ```
div()
语法
div(y numeric, x numeric)
返回类型
numeric
描述
y/x的整数商
示例
``` sql seaboxsql=# select div(9,4); div
2 (1 row) ```
exp()
语法
exp(dp or numeric)
返回类型
(和输入相同)
描述
指数
示例
``` sql seaboxsql=# select exp(1.0); exp
2.7182818284590452 (1 row) ```
floor()
语法
floor(dp or numeric)
返回类型
(和输入相同)
描述
不大于参数的最近的整数
示例
``` sql seaboxsql=# select floor(-42.8); floor
-43 (1 row) ```
ln()
语法
ln(dp or numeric)
返回类型
(和输入相同)
描述
自然对数
示例
``` sql seaboxsql=# select ln(2.0); ln
0.6931471805599453 (1 row) ```
log()
语法
log(dp or numeric),log(b numeric, x numeric)
返回类型
(和输入相同)
描述
参数为单个时返回以10为底的对数;参数为2个时,返回以第一个参赛为底的对数
示例
``` sql seaboxsql=# select log(100.0); log
2.0000000000000000 (1 row) seaboxsql=# select log(2.0, 64.0); log
6.0000000000000000 (1 row) ```
mod()
语法
mod(y, x)
返回类型
(和参数类型相同)
描述
y/x的余数
示例
``` sql seaboxsql=# select mod(9,4); mod
1 (1 row) ```
pi()
语法
pi()
返回类型
dp
描述
“π”常数
示例
``` sql seaboxsql=# select pi(); pi
3.141592653589793 (1 row) ```
语法
power(a dp, b dp), power(a numeric, b numeric)
返回类型
dpnumeric
描述
ab次幂
示例

``` sql seaboxsql=# select power(9.0, 3.0); power


729.0000000000000000 (1 row)

seaboxsql=# select power(9, 3); power


729 (1 row) ```

radians()
语法
radians(dp)
返回类型
dp
描述
把角度转为弧度
示例
``` sql seaboxsql=# select radians(45.0); radians
0.7853981633974483 (1 row) ```
random()
语法
random()
返回类型
dp
描述
返回范围 0.0 <= x < 1.0 中的随机值
示例
``` sql seaboxsql=# select random(); random
0.9551570087916872 (1 row) ```
round()
语法
round(dp or numeric), round(v numeric, s int)
返回类型
和输入相同
描述
参数为单个时返回四舍五入为最接近的整数, 参数为2个时,返回四舍五人第二个参数位小数位数
示例
``` sql seaboxsql=# select round(42.4); round

42 (1 row) seaboxsql=# select round(42.4382, 2); round


42.44 (1 row) ```

scale()
语法
scale(numeric)
返回类型
integer
描述
参数的精度(小数点后的位数)
示例
``` sql seaboxsql=# select scale(8.41); scale

2 (1 row) ```

setseed()
语法
setseed(dp)
返回类型
void
描述
为后续的random()调用设置种子(值为于 -1.0 和 1.0 之间,包括边界值),random()返回的值的特征取决于系统实现,不适合用于加密应用.
示例

``` sql seaboxsql=# select setseed(0.5); setseed


(1 row)

seaboxsql=# select random(); random


0.15245884620118844 (1 row) ```

sign()
语法
sign(dp or numeric)
返回类型
(和输入相同)
描述
参数的符号(-1, 0, +1)
示例
``` sql seaboxsql=# select sign(-8.4); sign
-1 (1 row) ```
sin()/sind()
语法
sin(dp),sind(dp)
描述
正弦, 其中sin参数为度数, sind参数为弧度,结果取值范围为[-1,1]
示例

``` sql seaboxsql=# select sin(-pi()/2); sin


-1 (1 row)

seaboxsql=# select sind(90); sind


1

(1 row) ```

sqrt()
语法
sqrt(dp or numeric)
返回类型
(和输入相同)
描述
平方根
示例
``` sql seaboxsql=# select sqrt(2.0); sqrt
1.414213562373095 (1 row) ```
tan()/tand()
语法
tan(dp),tand(dp)
描述
正切, 其中tan参数为度数, tand参数为弧度
示例

``` sql seaboxsql=# select tan(pi()/4); tan


0.9999999999999999 (1 row)

seaboxsql=# select tand(45); tand


1

(1 row) ```

trunc()
语法
trunc(dp or numeric), trunc(v numeric, s int)
返回类型
(和输入相同)
描述
参数为单个时,返回参数截断为整数的值; 参数为2个时,返回参数1按参数2小数位截断的值
示例

``` sql seaboxsql=# select trunc(42.8); trunc


42 (1 row)

seaboxsql=# select trunc(42.4382, 2); trunc


42.43 (1 row) ```

width_bucket()
语法
width_bucket(op dp/numeric, b1 dp/numeric, b2 dp/numeric, count int), width_bucket(operand anyelement, thresholds anyarray)
返回类型
int
描述
返回一个桶号,这个桶是在一个柱状图中operand将被分配的那个桶,该柱状图有count个散布在范围b1b2上的等宽桶。对于超过该范围的输入,将返回0或者count+1 ;在给定参数为数组时,operand 将被分配的桶,该数组列出了桶的下界。对于一个低于第一个下界的输入返回 0thresholds数组必须被排好序, 最小的排在最前面,否则将会得到意想不到的结果
示例

``` sql seaboxsql=# select width_bucket(5.35, 0.024, 10.06, 5); width_bucket


    3

(1 row)

seaboxsql=# select width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]); width_bucket


        2

(1 row) ```