数学函数和操作符
更新时间:2026-06-25
数学函数和操作符
PalopgMPP数据库为很多类型提供了数学操作符。对于那些没有标准数学表达的类型(如日期/时间类型),我们将在后续小节中描述实际的行为。
下表"表 数学操作符"展示了所有可用的数学操作符。
表 数学操作符
| 操作符 | 描述 | 例子 | 结果 |
|---|---|---|---|
+ |
加 | 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
1 palopgsql=# select abs(-17.4);
2 abs
3 ------
4 17.4
5 (1 row)
6 ```
7##### `acos()/acosd()`
8
9## 语法
10
11`acos(dp)`,`acosd(dp)`
12
13## 描述
14
15反余弦,参数取值范围为`[-1,1]`, 其中acosd返回度数, acos返回弧度
16
17## 示例
18
19``` sql
20 palopgsql=# select acos(-1);
21 acos
22 -------------------
23 3.141592653589793
24 (1 row)
25
26 palopgsql=# select acosd(-1);
27 acosd
28 -------
29 180
30 (1 row)
31 ```
32
33##### `asin()/asind()`
34
35## 语法
36
37`asin(dp)`,`asind(dp)`
38
39## 描述
40
41反正弦, 参数取值范围为`[-1,1]`, 其中asind返回度数, asin返回弧度
42
43## 示例
44
45``` sql
46 palopgsql=# select asind(-1);
47 asind
48 -------
49 -90
50 (1 row)
51
52 palopgsql=# select asin(-1);
53 asin
54 ---------------------
55 -1.5707963267948966
56 (1 row)
57 ```
58
59##### `atan()/atand()`
60
61## 语法
62
63`atan(dp)`,`atand(dp)`
64
65## 描述
66
67反正切, 参数取值范围为正负无穷大, 其中atand返回度数, atan返回弧度,结果取值范围为`(-90,90)`或`[-pi/2,pi/2]`
68
69## 示例
70
71``` sql
72 palopgsql=# select atand(1000000000);
73 atand
74 -------------------
75 89.99999994270424
76 (1 row)
77
78 palopgsql=# select atan(-1000000000);
79 atan
80 ---------------------
81 -1.5707963257948967
82 (1 row)
83 ```
84
85
86##### `atan2()/atan2d()`
87
88## 语法
89
90`atan2(dp,dp)`,`atan2d(dp,dp)`
91
92## 描述
93
94参数1除以参数2的反正切, 其中atan2d返回度数, atan2返回弧度,结果取值范围为`(-90,90)`或`[-pi/2,pi/2]`
95
96## 示例
97
98``` sql
99 palopgsql=# select atan2(-1000000000,100);
100 atan2
101 ---------------------
102 -1.5707962267948967
103 (1 row)
104
105 palopgsql=# select atan2d(-1000000000,100);
106 atan2d
107 --------------------
108 -89.99999427042206
109 (1 row)
110 ```
111
112##### `cbrt()`
113
114## 语法
115
116`cbrt(dp)`
117
118返回类型
119: `dp`
120
121## 描述
122
123立方根
124
125## 示例
126
127``` sql
128 palopgsql=# select cbrt(27.0);
129 cbrt
130 --------------------
131 3.0000000000000004
132 (1 row)
133 ```
134
135##### `ceil()/ceiling()`
136
137## 语法
138
139`ceiling(dp` or `numeric) `, `ceil(dp` or `numeric) `
140
141返回类型
142: 和输入相同
143
144## 描述
145
146不小于参数的最近的整数
147
148## 示例
149
150``` sql
151 palopgsql=# select ceil(-42.8);
152 ceil
153 ------
154 -42
155 (1 row)
156 palopgsql=# select ceiling(-95.3);
157 ceiling
158 ---------
159 -95
160 (1 row)
161 ```
162
163##### `cos()/cosd()`
164
165## 语法
166
167`cos(dp)`,`cosd(dp)`
168
169## 描述
170
171余弦, 其中cos参数为度数, cosd参数为弧度,结果取值范围为`[-1,1]`
172
173## 示例
174
175``` sql
176 palopgsql=# select cos(-pi());
177 cos
178 -----
179 -1
180 (1 row)
181 palopgsql=# select cosd(0);
182 cosd
183 ------
184 1
185 (1 row)
186 ```
187
188##### `cot()/cotd()`
189
190## 语法
191
192`cot(dp)`,`cotd(dp)`
193
194## 描述
195
196余切, 其中cot参数为度数, cotd参数为弧度
197
198## 示例
199
200``` sql
201 palopgsql=# select cot(pi()/4);
202 cot
203 --------------------
204 1.0000000000000002
205 (1 row)
206 palopgsql=# select cotd(45);
207 cotd
208 ------
209 1
210 (1 row)
211 ```
212
213##### `degrees()`
214
215## 语法
216
217`degrees(dp)`
218
219返回类型
220: `dp`
221
222## 描述
223
224把弧度转为角度
225
226## 示例
227
228``` sql
229 palopgsql=# select degrees(0.5);
230 degrees
231 -------------------
232 28.64788975654116
233 (1 row)
234 ```
235
236
237##### `div()`
238
239## 语法
240
241`div(y` `numeric`, *`x`* `numeric)`
242
243返回类型
244: `numeric`
245
246## 描述
247
248*`y`*/*`x`*的整数商
249
250## 示例
251
252``` sql
253 palopgsql=# select div(9,4);
254 div
255 -----
256 2
257 (1 row)
258 ```
259
260
261
262##### `exp()`
263
264## 语法
265
266`exp(dp` or `numeric)`
267
268返回类型
269: (和输入相同)
270
271## 描述
272
273指数
274
275## 示例
276
277``` sql
278 palopgsql=# select exp(1.0);
279 exp
280 --------------------
281 2.7182818284590452
282 (1 row)
283 ```
284
285
286##### `floor()`
287
288## 语法
289
290`floor(dp` or `numeric)`
291
292返回类型
293: (和输入相同)
294
295## 描述
296
297不大于参数的最近的整数
298
299## 示例
300
301``` sql
302 palopgsql=# select floor(-42.8);
303 floor
304 -------
305 -43
306 (1 row)
307 ```
308
309##### `ln()`
310
311## 语法
312
313`ln(dp` or `numeric)`
314
315返回类型
316: (和输入相同)
317
318## 描述
319
320自然对数
321
322## 示例
323
324``` sql
325 palopgsql=# select ln(2.0);
326 ln
327 --------------------
328 0.6931471805599453
329 (1 row)
330 ```
331
332
333##### `log()`
334
335## 语法
336
337`log(dp` or `numeric)`,`log(b` `numeric`, *`x`* `numeric)`
338
339返回类型
340: (和输入相同)
341
342## 描述
343
344参数为单个时返回以10为底的对数;参数为2个时,返回以第一个参赛为底的对数
345
346## 示例
347
348``` sql
349 palopgsql=# select log(100.0);
350 log
351 --------------------
352 2.0000000000000000
353 (1 row)
354 palopgsql=# select log(2.0, 64.0);
355 log
356 --------------------
357 6.0000000000000000
358 (1 row)
359 ```
360
361##### `mod()`
362
363## 语法
364
365`mod(y`, *`x`*)
366
367返回类型
368: (和参数类型相同)
369
370## 描述
371
372*`y`*/*`x`*的余数
373
374## 示例
375
376``` sql
377 palopgsql=# select mod(9,4);
378 mod
379 -----
380 1
381 (1 row)
382 ```
383
384##### `pi()`
385
386## 语法
387
388`pi()`
389
390返回类型
391: `dp`
392
393## 描述
394
395“π”常数
396
397## 示例
398
399``` sql
400 palopgsql=# select pi();
401 pi
402 -------------------
403 3.141592653589793
404 (1 row)
405 ```
406
407#####
408
409## 语法
410
411`power(a` `dp`, *`b`* `dp)`, `power(a` `numeric`, *`b`* `numeric)`
412
413返回类型
414: `dp`或`numeric`
415
416## 描述
417
418求*`a`*的*`b`*次幂
419
420## 示例
421
422``` sql
423 palopgsql=# select power(9.0, 3.0);
424 power
425 ----------------------
426 729.0000000000000000
427 (1 row)
428
429 palopgsql=# select power(9, 3);
430 power
431 -------
432 729
433 (1 row)
434 ```
435
436##### `radians()`
437
438## 语法
439
440`radians(dp)`
441
442返回类型
443: `dp`
444
445## 描述
446
447把角度转为弧度
448
449## 示例
450
451``` sql
452 palopgsql=# select radians(45.0);
453 radians
454 --------------------
455 0.7853981633974483
456 (1 row)
457 ```
458
459##### `random()`
460
461## 语法
462
463`random()`
464
465返回类型
466: `dp`
467
468## 描述
469
470返回范围 0.0 \<= x \< 1.0 中的随机值
471
472## 示例
473
474``` sql
475 palopgsql=# select random();
476 random
477 --------------------
478 0.9551570087916872
479 (1 row)
480 ```
481
482##### `round()`
483
484## 语法
485
486`round(dp` or `numeric)`, `round(v` `numeric`, *`s`* `int)`
487
488返回类型
489: 和输入相同
490
491## 描述
492
493参数为单个时返回四舍五入为最接近的整数, 参数为2个时,返回四舍五人第二个参数位小数位数
494
495## 示例
496
497``` sql
498 palopgsql=# select round(42.4);
499 round
500 -------
501 42
502 (1 row)
503 palopgsql=# select round(42.4382, 2);
504 round
505 -------
506 42.44
507 (1 row)
508 ```
509
510##### `scale()`
511
512## 语法
513
514`scale(numeric)`
515
516返回类型
517: `integer`
518
519## 描述
520
521参数的精度(小数点后的位数)
522
523## 示例
524
525``` sql
526 palopgsql=# select scale(8.41);
527 scale
528 -------
529 2
530 (1 row)
531 ```
532
533
534##### `setseed()`
535
536## 语法
537
538`setseed(dp)`
539
540返回类型
541: `void`
542
543## 描述
544
545为后续的`random()`调用设置种子(值为于 -1.0 和 1.0 之间,包括边界值),`random()`返回的值的特征取决于系统实现,不适合用于加密应用.
546
547## 示例
548
549``` sql
550 palopgsql=# select setseed(0.5);
551 setseed
552 ---------
553
554 (1 row)
555
556 palopgsql=# select random();
557 random
558 ---------------------
559 0.15245884620118844
560 (1 row)
561 ```
562
563
564##### `sign()`
565
566## 语法
567
568`sign(dp` or `numeric)`
569
570返回类型
571: (和输入相同)
572
573## 描述
574
575参数的符号(-1, 0, +1)
576
577## 示例
578
579``` sql
580 palopgsql=# select sign(-8.4);
581 sign
582 ------
583 -1
584 (1 row)
585 ```
586
587
588##### `sin()/sind()`
589
590## 语法
591
592`sin(dp)`,`sind(dp)`
593
594## 描述
595
596正弦, 其中sin参数为度数, sind参数为弧度,结果取值范围为`[-1,1]`
597
598## 示例
599
600``` sql
601 palopgsql=# select sin(-pi()/2);
602 sin
603 -----
604 -1
605 (1 row)
606
607 palopgsql=# select sind(90);
608 sind
609 ------
610 1
611 (1 row)
612 ```
613
614
615##### `sqrt()`
616
617## 语法
618
619`sqrt(dp` or `numeric)`
620
621返回类型
622: (和输入相同)
623
624## 描述
625
626平方根
627
628## 示例
629
630``` sql
631 palopgsql=# select sqrt(2.0);
632 sqrt
633 -------------------
634 1.414213562373095
635 (1 row)
636 ```
637
638
639
640##### `tan()/tand()`
641
642## 语法
643
644`tan(dp)`,`tand(dp)`
645
646## 描述
647
648正切, 其中tan参数为度数, tand参数为弧度
649
650## 示例
651
652``` sql
653 palopgsql=# select tan(pi()/4);
654 tan
655 --------------------
656 0.9999999999999999
657 (1 row)
658
659 palopgsql=# select tand(45);
660 tand
661 ------
662 1
663 (1 row)
664 ```
665
666##### `trunc()`
667
668## 语法
669
670`trunc(dp` or `numeric)`, `trunc(v` `numeric`, *`s`* `int)`
671
672返回类型
673: (和输入相同)
674
675## 描述
676
677参数为单个时,返回参数截断为整数的值; 参数为2个时,返回参数1按参数2小数位截断的值
678
679## 示例
680
681``` sql
682 palopgsql=# select trunc(42.8);
683 trunc
684 -------
685 42
686 (1 row)
687
688 palopgsql=# select trunc(42.4382, 2);
689 trunc
690 -------
691 42.43
692 (1 row)
693 ```
694
695
696##### `width_bucket()`
697
698## 语法
699
700`width_bucket(op` `dp/numeric`, *`b1`* `dp/numeric`, *`b2`* `dp/numeric`, *`count`* `int)`, `width_bucket(operand` `anyelement`, *`thresholds`* `anyarray)`
701
702
703返回类型
704: `int`
705
706## 描述
707
708返回一个桶号,这个桶是在一个柱状图中*`operand`*将被分配的那个桶,该柱状图有*`count`*个散布在范围*`b1`*到*`b2`*上的等宽桶。对于超过该范围的输入,将返回`0`或者`count`+1 ;在给定参数为数组时,*`operand`* 将被分配的桶,该数组列出了桶的下界。对于一个低于第一个下界的输入返回 `0`。*`thresholds`*数组*必须被排好序*, 最小的排在最前面,否则将会得到意想不到的结果
709
710## 示例
711
712``` sql
713 palopgsql=# select width_bucket(5.35, 0.024, 10.06, 5);
714 width_bucket
715 --------------
716 3
717 (1 row)
718
719 palopgsql=# select width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]);
720 width_bucket
721 --------------
722 2
723 (1 row)
724 ```
评价此篇文章
