数学函数和操作符
数学函数和操作符¶
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 |
按位操作操作符只能用于整数数据类型,而其它的操作符可以用于全部数字数据类型。按位操作的操作符还可以用于位串类型bit
和bit 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
ornumeric)
,ceil(dp
ornumeric)
- 返回类型
- 和输入相同
- 描述
- 不小于参数的最近的整数
- 示例
- ``` 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
ornumeric)
- 返回类型
- (和输入相同)
- 描述
- 指数
- 示例
- ``` sql
seaboxsql=# select exp(1.0);
exp
2.7182818284590452 (1 row) ```
floor()
¶
- 语法
floor(dp
ornumeric)
- 返回类型
- (和输入相同)
- 描述
- 不大于参数的最近的整数
- 示例
- ``` sql
seaboxsql=# select floor(-42.8);
floor
-43 (1 row) ```
ln()
¶
- 语法
ln(dp
ornumeric)
- 返回类型
- (和输入相同)
- 描述
- 自然对数
- 示例
- ``` sql
seaboxsql=# select ln(2.0);
ln
0.6931471805599453 (1 row) ```
log()
¶
- 语法
log(dp
ornumeric)
,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)
- 返回类型
dp
或numeric
- 描述
- 求
a
的b
次幂 - 示例
-
``` 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
ornumeric)
,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
ornumeric)
- 返回类型
- (和输入相同)
- 描述
- 参数的符号(-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
ornumeric)
- 返回类型
- (和输入相同)
- 描述
- 平方根
- 示例
- ``` 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
ornumeric)
,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
个散布在范围b1
到b2
上的等宽桶。对于超过该范围的输入,将返回0
或者count
+1 ;在给定参数为数组时,operand
将被分配的桶,该数组列出了桶的下界。对于一个低于第一个下界的输入返回0
。thresholds
数组必须被排好序, 最小的排在最前面,否则将会得到意想不到的结果 - 示例
-
``` 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) ```