其中一些函数通过具有不同自变量类型的多种形式提供。除非另有注明,否则函数的给定形式返回与它的自变量相同的数据类型。在边界情况下,函数与 DOUBLE PRECISION
数据配合使用的准确性和行为可能会有所不同,具体取决于主机系统。
算数函数
- 1: ABS
- 2: ACOS
- 3: ASIN
- 4: ATAN
- 5: ATAN2
- 6: CBRT
- 7: CEILING
- 8: COS
- 9: COSH
- 10: COT
- 11: DEGREES
- 12: DISTANCE
- 13: DISTANCEV
- 14: EXP
- 15: FLOOR
- 16: HASH
- 17: LN
- 18: LOG
- 19: LOG10
- 20: MOD
- 21: PI
- 22: POWER
- 23: RADIANS
- 24: RANDOM
- 25: RANDOMINT
- 26: RANDOMINT_CRYPTO
- 27: ROUND
- 28: SIGN
- 29: SIN
- 30: SINH
- 31: SQRT
- 32: TAN
- 33: TANH
- 34: TRUNC
- 35: WIDTH_BUCKET
1 - ABS
返回实参的绝对值。返回值与实参的数据类型相同。
行为类型
不可变语法
ABS ( expression )
参数
expression
- 为 INTEGER 或 DOUBLE PRECISION 类型的值
示例
SELECT ABS(-28.7);
abs
------
28.7
(1 row)
2 - ACOS
返回一个 DOUBLE PRECISION 值,该值表示实参的反三角余弦。
行为类型
不可变语法
ACOS ( expression )
参数
expression
- 为 DOUBLE PRECISION 类型的值
示例
SELECT ACOS (1);
acos
------
0
(1 row)
3 - ASIN
返回一个 DOUBLE PRECISION 值,该值表示实参的三角反正弦。
行为类型
不可变语法
ASIN ( expression )
参数
expression
- 为 DOUBLE PRECISION 类型的值
示例
SELECT ASIN(1);
asin
-----------------
1.5707963267949
(1 row)
4 - ATAN
返回一个 DOUBLE PRECISION 值,该值表示实参的三角反正切。
行为类型
不可变语法
ATAN ( expression )
参数
- 表达式
- DOUBLE PRECISION 值
示例
SELECT ATAN(1);
atan
-------------------
0.785398163397448
(1 row)
5 - ATAN2
返回一个 DOUBLE PRECISION 值,该值表示实参的算术被除数的三角反正切。
行为类型
不可变语法
ATAN2 ( quotient, divisor )
参数
quotient
- 为表示商的 DOUBLE PRECISION 类型的表达式
divisor
- 为表示除数的 DOUBLE PRECISION 类型的表达式
示例
SELECT ATAN2(2,1);
ATAN2
------------------
1.10714871779409
(1 row)
6 - CBRT
返回实参的立方根。返回值的类型为 DOUBLE PRECISION。
行为类型
不可变语法
CBRT ( expression )
参数
expression
- DOUBLE PRECISION 类型的值
示例
SELECT CBRT(27.0);
cbrt
------
3
(1 row)
7 - CEILING
将返回值向上舍入到下一个整数。例如,给定实参 5.01 和 5.99,CEILING 返回 6。CEILING 与 FLOOR 相对,它向下舍入返回值。
行为类型
不可变语法
CEIL[ING] ( expression )
参数
- 表达式
- 解析为 INTEGER 或 DOUBLE PRECISION 值。
示例
=> SELECT CEIL(-42.8);
CEIL
------
-42
(1 row)
SELECT CEIL(48.01);
CEIL
------
49
(1 row)
8 - COS
返回一个 DOUBLE PRECISION 值,该值表示所传递参数的三角余弦。
行为类型
不可变语法
COS ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
SELECT COS(-1);
COS
------------------
0.54030230586814
(1 row)
9 - COSH
返回一个 DOUBLE PRECISION 值,该值表示所传递参数的双曲余弦。
行为类型
不可变语法
COSH ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
=> SELECT COSH(-1);
COSH
------------------
1.54308063481524
10 - COT
返回一个 DOUBLE PRECISION 值,该值表示实参的三角余切。
行为类型
不可变语法
COT ( expression )
参数
expression
- 为 DOUBLE PRECISION 类型的值
示例
SELECT COT(1);
cot
-------------------
0.642092615934331
(1 row)
11 - DEGREES
将表达式从弧度转换为小数度,或从度、分钟和秒转换为小数度。返回值的类型为 DOUBLE PRECISION。
行为类型
不可变语法
DEGREES ( { radians | degrees, minutes, seconds } )
参数
- 弧度
角度测量单位。2π 弧度等于全角度。
- 度
角度测量单位,等于全角度的 1/360。
- 分钟
角度测量单位,表示 1/60 度。
- 秒
角度测量单位,表示 1/60 分钟。
示例
SELECT DEGREES(0.5);
DEGREES
------------------
28.6478897565412
(1 row)
SELECT DEGREES(1,2,3);
DEGREES
------------------
1.03416666666667
(1 row)
12 - DISTANCE
返回两点之间的距离(以千米为单位)。指定起点和终点的纬度和经度。使用椭球体模型时,还可以指定曲率半径以实现更高的精度。
行为类型
不可变语法
DISTANCE ( lat0, lon0, lat1, lon1 [, radius‑of‑curvature ] )
参数
- lat0
- 起点纬度。
- lon0
- 起点经度。
- lat1
- 终点纬度
- lon1
- 终点经度。
- radius‑of‑curvature
- 指定起点与终点的中点处的地球曲率半径。当使用椭球状地球模型时,此参数允许更高的精度。如果忽略此参数,则 DISTANCE 使用 WGS-84 r1 平均半径,约为 6371.009 km。
示例
此示例查找纬度 45 度、经度 1 度的距离(以千米为单位),假设地球为球形。
SELECT DISTANCE(45,0,45,1);
DISTANCE
----------------------
78.6262959272162
(1 row)
13 - DISTANCEV
使用 Vincenty 公式返回两点之间的距离(以千米为单位)。由于 Vincenty 公式包含 WGS-84 椭球体模型的参数,因此无需指定曲率半径。指定起点和终点的纬度和经度。此函数的精度高于 DISTANCE 函数,但速度较慢。
行为类型
不可变语法
DISTANCEV (lat0, lon0, lat1, lon1);
参数
- lat0
- 指定起点的纬度。
- lon0
- 指定起点的经度。
- lat1
- 指定终点的纬度。
- lon1
- 指定终点的经度。
示例
此示例查找纬度 45 度、经度 1 度的距离(以千米为单位),假设地球为椭球形。
SELECT DISTANCEV(45,0, 45,1);
distanceV
------------------
78.8463347095916
(1 row)
14 - EXP
返回指数函数,即某个数字的 e 次幂。返回值与实参的数据类型相同。
行为类型
不可变语法
EXP ( exponent )
参数
exponent
- 为 INTEGER 或 DOUBLE PRECISION 类型表达式
示例
SELECT EXP(1.0);
exp
------------------
2.71828182845905
(1 row)
15 - FLOOR
将返回值向下舍入为前一个整数。例如,给定实参 5.01 和 5.99,FLOOR 返回 5。FLOOR 与 CEILING 相对,它向上舍入返回值。
行为类型
不可变语法
FLOOR ( expression )
参数
- 表达式
- 解析为 INTEGER 或 DOUBLE PRECISION 值。
示例
=> SELECT FLOOR((TIMESTAMP '2005-01-17 10:00' - TIMESTAMP '2005-01-01') / INTERVAL '7');
FLOOR
-------
2
(1 row)
=> SELECT FLOOR(-42.8);
FLOOR
-------
-43
(1 row)
=> SELECT FLOOR(42.8);
FLOOR
-------
42
(1 row)
虽然以下示例看似 INTEGER,但左侧的数字为 INTEGER (2^49),而右侧的数字为 FLOAT:
=> SELECT 1<<49, FLOOR(1 << 49);
?column? | floor
-----------------+-----------------
562949953421312 | 562949953421312
(1 row)
将前一示例与以下示例进行比较:
=> SELECT 1<<50, FLOOR(1 << 50);
?column? | floor
------------------+----------------------
1125899906842624 | 1.12589990684262e+15
(1 row)
16 - HASH
通过函数实参计算哈希值,从而产生位于范围
0 <= x < 263
内的值。
HASH
函数通常用于对一组群集节点中的投射进行分段。此函数基于行在列中的值选择每个行的特定节点。HASH
函数在群集中均匀分布数据,有利于优化查询执行。
行为类型
不可变语法
HASH ( { * | expression[,...] } )
参数
-
* | expression[,...]
- 以下几项之一:
示例
=> SELECT HASH(product_price, product_cost) FROM product_dimension
WHERE product_price = '11';
hash
---------------------
4157497907121511878
1799398249227328285
3250220637492749639
(3 rows)
另请参阅
哈希分段子句17 - LN
返回实参的自然对数。返回数据类型与实参相同。
行为类型
不可变语法
LN ( expression )
参数
expression
- 为 INTEGER 或 DOUBLE PRECISION 类型表达式
示例
SELECT LN(2);
ln
-------------------
0.693147180559945
(1 row)
18 - LOG
返回实参的指定底的对数。返回值的数据类型与传递参数的数据类型相同。
行为类型
不可变语法
LOG ( [ base, ] expression )
参数
base
- 指定基数(默认值为基数 10)
expression
- INTEGER 或 DOUBLE PRECISION 类型表达式
示例
=> SELECT LOG(2.0, 64);
LOG
-----
6
(1 row)
SELECT LOG(100);
LOG
-----
2
(1 row)
19 - LOG10
返回 10 个基本实参对数,也被称为常用对数。返回值的数据类型与通过参数的数据类型相同。
行为类型
不可变语法
LOG10 ( expression )
参数
expression
- INTEGER 或 DOUBLE PRECISION 类型表达式
示例
=> SELECT LOG10(30);
LOG10
------------------
1.47712125471966
(1 row)
20 - MOD
返回除法运算的余数。
行为类型
不可变语法
MOD( expression1, expression2 )
参数
- expression1
- 指定被除数的数字数据类型。
- expression2
- 指定除数的数字数据类型。
计算规则
计算
MOD(expression1, expression2
) 是采用下列规则:
-
如果 expression1 或 expression2 是 NULL 值,则结果是 NULL 值。
-
如果 expression2 是零,则出现例外情况:数据异常 — 除数为 0。
-
否则,结果是唯一的确切数字值 R,标度为 0 (zero),则下列各项为 true:
-
R 与 expression2 具有相同的符号。
-
R 的绝对值小于 expression1 的绝对值。
-
对于标度为 0 (零) 的一些精确数字值 K,expression2 = expression1 * K + R。
-
示例
SELECT MOD(9,4);
mod
-----
1
(1 row)
SELECT MOD(10,3);
mod
-----
1
(1 row)
SELECT MOD(-10,3);
mod
-----
-1
(1 row)
SELECT MOD(-10,-3);
mod
-----
-1
(1 row)
SELECT MOD(10,-3);
mod
-----
1
(1 row)
=> SELECT MOD(6.2,0);
ERROR 3117: Division by zero
21 - PI
返回常数 pi (P),即欧式几何中任何圆的周长与其直径的比值。返回类型为 DOUBLE PRECISION。
行为类型
不可变语法
PI()
示例
SELECT PI();
pi
------------------
3.14159265358979
(1 row)
22 - POWER
返回 DOUBLE PRECISION 值,表示一个数字的另一个数字的幂。
行为类型
不可变语法
POW[ER] ( expression1, expression2 )
参数
- expression1
- 表示基数的 DOUBLE PRECISION 值。
- expression2
- 表示指数的 DOUBLE PRECISION 值。
示例
SELECT POWER(9.0, 3.0);
power
-------
729
(1 row)
23 - RADIANS
返回一个 DOUBLE PRECISION 值,该值表示以弧度表示的角度。您可以在 DEGREES 中表达输入角度,并且可以选择包括分钟数和秒数。
行为类型
不可变语法
RADIANS (degrees [, minutes, seconds])
参数
degrees
- 角度测量单位,表示全角度的 1/360。
minutes
- 角度测量单位,表示 1/60 度。
seconds
- 角度测量单位,表示 1/60 分钟。
示例
SELECT RADIANS(45);
RADIANS
-------------------
0.785398163397448
(1 row)
SELECT RADIANS (1,2,3);
RADIANS
-------------------
0.018049613347708
(1 row)
24 - RANDOM
返回均匀分布的随机 DOUBLE PRECISION 值 x,其中
0
<= x < 1。
典型的伪随机发生器接受一个种子,该种子被设置为生成可重现的伪随机序列。但是,Vertica 会在节点群集中分布 SQL 处理,其中每个节点都产生其自己的独立随机序列。
基于 RANDOM 的结果是不可重现的,因为该工作可能在各个节点之间以不同方式划分。因此,Vertica 会在每次执行请求时为每个节点自动生成真正的随机种子,并且不会提供一种机制来强制生成特定种子。
行为类型
易变语法
RANDOM()
示例
在下例中,RANDOM 返回 ≥ 0 且 < 1.0 的浮点数:
SELECT RANDOM();
random
-------------------
0.211625560652465
(1 row)
25 - RANDOMINT
接受并返回 INTEGER
值。
RANDOMINT(n)
返回从 0
到 n – 1
的 n 个整数之一。
典型的伪随机发生器接受一个种子,该种子被设置为生成可重现的伪随机序列。但是,Vertica 会在节点群集中分布 SQL 处理,其中每个节点都产生其自己的独立随机序列。
基于 RANDOM 的结果是不可重现的,因为该工作可能在各个节点之间以不同方式划分。因此,Vertica 会在每次执行请求时为每个节点自动生成真正的随机种子,并且不会提供一种机制来强制生成特定种子。
行为类型
易变语法
RANDOMINT ( n )
参数
接受的值为介于 1 到 9,223,372,036,854,775,807 之间的任何正整数 (n)。
有关整数数据类型的常规信息,请参阅 INTEGER 部分。
限制
如果提供负值或超出最大值,Vertica 将返回错误。
示例
在下例中,结果为 INTEGER,即 >= 0
且 < n,从集合 {0,1,2,3,4} 中随机选择。
=> SELECT RANDOMINT(5);
RANDOMINT
----------
3
(1 row)
26 - RANDOMINT_CRYPTO
接受并返回从 0 到指定函数实参 -1 之间的一组值中的一个 INTEGER 值。对于此加密随机数生成器,Vertica 使用 RAND_bytes 提供随机值。
行为类型
易变语法
RANDOMINT_CRYPTO ( integer‑expression )
参数
- integer‑expression
- 解析为介于 1 到 263(包含 1)之间的正整数。
示例
在下例中,RANDOMINT_CRYPTO 返回 >= 0
且小于指定实参 5
的 INTEGER,从集合 {0,1,2,3,4}
中随机选择。
=> SELECT RANDOMINT_crypto(5);
RANDOMINT_crypto
----------------
3
(1 row)
27 - ROUND
将值四舍五入到指定的小数位数,保留原始精度和小数位数。大于或等于 0.5 的小数部分将四舍五入。小于 0.5 的分数向下舍入(截断)。
行为类型
不可变语法
ROUND ( expression [ , places ] )
参数
expression
- 为
NUMERIC
或DOUBLE PRECISION (FLOAT)
类型的表达式。 places
- INTEGER 值。当
places
为正整数时,Vertica 使用指定位数对小数点右侧的值进行四舍五入。当places
为负整数时,Vertica 使用指定位数对小数点左侧的值进行四舍五入。
注意
将 ROUND
与 NUMERIC
数据类型配合使用,则返回 NUMERIC
并保留原始精度和标度。
=> SELECT ROUND(3.5);
ROUND
-------
4.0
(1 row)
示例
=> SELECT ROUND(2.0, 1.0) FROM dual;
ROUND
-------
2.0
(1 row)
=> SELECT ROUND(12.345, 2.0);
ROUND
--------
12.350
(1 row)
=> SELECT ROUND(3.444444444444444);
ROUND
-------------------
3.000000000000000
(1 row)
=> SELECT ROUND(3.14159, 3);
ROUND
---------
3.14200
(1 row)
=> SELECT ROUND(1234567, -3);
ROUND
---------
1235000
(1 row)
=> SELECT ROUND(3.4999, -1);
ROUND
--------
0.0000
(1 row)
以下示例创建了一个包含两列的表,添加了一行值,显示小数点左侧和右侧的舍入示例。
=> CREATE TABLE sampleround (roundcol1 NUMERIC, roundcol2 NUMERIC);
CREATE TABLE
=> INSERT INTO sampleround VALUES (1234567, .1234567);
OUTPUT
--------
1
(1 row)
=> SELECT ROUND(roundcol1,-3) AS pn3, ROUND(roundcol1,-4) AS pn4, ROUND(roundcol1,-5) AS pn5 FROM sampleround;
pn3 | pn4 | pn5
-------------------------+-------------------------+-------------------------
1235000.000000000000000 | 1230000.000000000000000 | 1200000.000000000000000
(1 row)
=> SELECT ROUND(roundcol2,3) AS p3, ROUND(roundcol2,4) AS p4, ROUND(roundcol2,5) AS p5 FROM sampleround;
p3 | p4 | p5
-------------------+-------------------+-------------------
0.123000000000000 | 0.123500000000000 | 0.123460000000000
(1 row)
28 - SIGN
返回 DOUBLE PRECISION 值 -1、0 或 1,该值表示实参的算术符号。
行为类型
不可变语法
SIGN ( expression )
参数
expression
- 为 DOUBLE PRECISION 类型表达式
示例
SELECT SIGN(-8.4);
sign
------
-1
(1 row)
29 - SIN
返回 DOUBLE PRECISION 值,表示已传递参数的三角正弦。
行为类型
不可变语法
SIN ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
SELECT SIN(30 * 2 * 3.14159 / 360);
SIN
-------------------
0.499999616987256
(1 row)
30 - SINH
返回 DOUBLE PRECISION 值,表示已传递参数的双曲正弦。
行为类型
不可变语法
SINH ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
=> SELECT SINH(30 * 2 * 3.14159 / 360);
SINH
-------------------
0.547852969600632
31 - SQRT
返回一个 DOUBLE PRECISION 值,该值表示实参的算术平方根。
行为类型
不可变语法
SQRT ( expression )
参数
expression
- 为 DOUBLE PRECISION 类型表达式
示例
SELECT SQRT(2);
sqrt
-----------------
1.4142135623731
(1 row)
32 - TAN
返回一个 DOUBLE PRECISION 值,该值表示所传递参数的三角正切。
行为类型
不可变语法
TAN ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
=> SELECT TAN(30);
TAN
-------------------
-6.40533119664628
(1 row)
33 - TANH
返回 DOUBLE PRECISION 值表示传递参数的双曲正切。
行为类型
不可变语法
TANH ( expression )
参数
expression
- DOUBLE PRECISION 类型的表达式
示例
=> SELECT TANH(-1);
TANH
-------------------
-0.761594155955765
34 - TRUNC
返回完全截断的 expression 值(接近零)。提供 places 实参可将表达式截断为您指定的小数位数。
行为类型
不可变语法
TRUNC ( expression [ , places ] )
参数
expression
- 为
NUMERIC
或DOUBLE PRECISION (FLOAT)
类型的表达式。 places
- INTEGER 值。当 places 为正整数时,Vertica 可对小数点右侧的值进行截断。当 places 为负整数时,Vertica 可对小数点左侧的值进行截断。
注意
将 TRUNC
与 NUMERIC
数据类型配合使用,则返回 NUMERIC
并保留原始精度和标度。
=> SELECT TRUNC(3.5);
TRUNC
-------
3.0
(1 row)
示例
=> SELECT TRUNC(42.8);
TRUNC
-------
42.0
(1 row)
=> SELECT TRUNC(42.4382, 2);
TRUNC
---------
42.4300
(1 row)
以下示例创建了一个包含两列的表,添加了一行值,显示小数点左侧和右侧的截断示例。
=> CREATE TABLE sampletrunc (truncol1 NUMERIC, truncol2 NUMERIC);
CREATE TABLE
=> INSERT INTO sampletrunc VALUES (1234567, .1234567);
OUTPUT
--------
1
(1 row)
=> SELECT TRUNC(truncol1,-3) AS p3, TRUNC(truncol1,-4) AS p4, TRUNC(truncol1,-5) AS p5 FROM sampletrunc;
p3 | p4 | p5
-------------------------+-------------------------+-------------------------
1234000.000000000000000 | 1230000.000000000000000 | 1200000.000000000000000
(1 row)
=> SELECT TRUNC(truncol2,3) AS p3, TRUNC(truncol2,4) AS p4, TRUNC(truncol2,5) AS p5 FROM sampletrunc;
p3 | p4 | p5
-------------------+-------------------+-------------------
0.123000000000000 | 0.123400000000000 | 0.123450000000000
(1 row)
35 - WIDTH_BUCKET
构建等宽直方图,其中直方图的范围被分为相同大小的区间(存储桶)。此外,低存储桶以下的值返回 0,高存储桶以上的值返回 bucket_count +1。返回整数值。
行为类型
不可变语法
WIDTH_BUCKET ( expression, hist_min, hist_max, bucket_count )
参数
expression
- 为其创建直方图的表达式。此表达式必须评估为 numeric 或 datetime 值,或可隐式转换为 numeric 或 datetime 值。如果 expression 求值结果为 NULL,则 expression 返回 NULL。
hist_min
- 一个表达式,解析为存储桶 1 的下限。必须也评估为 numeric 或 datetime 值,不能评估为 null。
hist_max
- 一个表达式,解析为存储桶 bucket_count 上限。必须也评估为 numeric 或 datetime 值,不能评估为 null。
bucket_count
- 一个表达式,解析为常数,代表存储桶的数量。此表达式始终评估为正数 INTEGER。
注意
-
WIDTH_BUCKET 将数据集分成多个等宽的存储桶。例如,Age = 0–20, 20–40, 40–60, 60–80。这称为等宽直方图。
-
使用 WIDTH_BUCKET 时,请注意最小和最大边界值。每个存储桶包含等于或大于该存储桶基准数的值,所以年龄范围 0–20、20–40 等等实际上是 0–19.99 和 20–39.999。
-
WIDTH_BUCKET 接受以下数据类型:(FLOAT 和/或 INTEGER)、(TIMESTAMP 和/或 DATE 和/或 TIMESTAMPTZ)或 (INTERVAL和/或 TIME)。
示例
下述示例返回五个可能值,有三个存储桶:0 [100以下)、1 [100–300)、2 [300–500)、3 [500–700) 和 4 [700 及以上):
SELECT product_description, product_cost, WIDTH_BUCKET(product_cost, 100, 700, 3);
下述示例针对康涅狄格州的女医生顾客,在 annual_income 列上创建包含九个存储桶的直方图。结果将存储桶编号返回到“Income”列,共分为 11 个存储桶,其中包括下溢桶和溢出桶。请注意,如果顾客的年收入高于最大值,则分配到溢出桶 10:
SELECT customer_name, annual_income, WIDTH_BUCKET (annual_income, 100000, 1000000, 9) AS "Income"
FROM public.customer_dimension WHERE customer_state='CT'
AND title='Dr.' AND customer_gender='Female' AND household_id < '1000'
ORDER BY "Income";
在下述结果集中,之所以有存储桶 0,是因为存储桶从 1 到 bucket_count
进行编号。任何低于 hist_min
给定值的,都进入存储桶 0;任何高于 hist_max
给定值的,都进入存储桶 bucket_count+1
。在这个示例中,存储桶 9 是空的,没有溢出。值 12,283 小于 100,000,因此进入下溢桶。
customer_name | annual_income | Income
--------------------+---------------+--------
Joanna A. Nguyen | 12283 | 0
Amy I. Nguyen | 109806 | 1
Juanita L. Taylor | 219002 | 2
Carla E. Brown | 240872 | 2
Kim U. Overstreet | 284011 | 2
Tiffany N. Reyes | 323213 | 3
Rebecca V. Martin | 324493 | 3
Betty . Roy | 476055 | 4
Midori B. Young | 462587 | 4
Martha T. Brown | 687810 | 6
Julie D. Miller | 616509 | 6
Julie Y. Nielson | 894910 | 8
Sarah B. Weaver | 896260 | 8
Jessica C. Nielson | 861066 | 8
(14 rows)