NUMERIC
数字数据类型存储定点数字数据。例如,价值 $123.45 可存储于 NUMERIC(5,2)
字段。请注意,第一个数字(精度)指定总位数。
语法
numeric‑type [ ( precision[, scale] ) ]
参数
默认精度和标度
NUMERIC
、DECIMAL
、NUMBER
和 MONEY
的默认精度和标度值不同:
支持的编码
Vertica 支持 数字数据类型的以下编码:
-
精度 ≤ 18:
AUTO
、BLOCK_DICT
、BLOCKDICT_COMP
、COMMONDELTA_COMP
、DELTAVAL
、GCDDELTA
和RLE
-
精密 >;18:
AUTO
、BLOCK_DICT
、BLOCKDICT_COMP
、RLE
有关详细信息,请参阅编码类型。
数字与整数和浮点数据类型
数字数据类型是存储具有特定精度和标度的值的精确数据类型,通过小数点前后的若干数字表示。这与 Vertica 整数和浮点数据类型形成对比:
-
DOUBLE PRECISION (FLOAT) 支持 ~15 数字、变指数,近似表示数字值。它可能不如 NUMERIC 数据类型精确。
-
INTEGER 支持 ~18 数字,仅限整数。
NUMERIC 数据类型是非整数常量的首选,因为其结果总是精确的。例如:
=> SELECT 1.1 + 2.2 = 3.3;
?column?
----------
t
(1 row)
=> SELECT 1.1::float + 2.2::float = 3.3::float;
?column?
----------
f
(1 row)
数字操作
支持的数字操作如下:
-
NUMERIC 除数运算直接运行于数字值,不会转换为浮点数。运算结果具有至少 18 位,且四舍五入。
-
NUMERIC 模数运算(包括%)直接运行于数字值,不会转换为浮点数。结果与分子具有相同标度,无需四舍五入。
-
一些使用数字数据类型复杂操作会导致隐式转换为 FLOAT。使用 SQRT、STDDEV、超越函数,例如 LOG 以及 TO_CHAR/TO_NUMBER 格式化时,结果总是 FLOAT。
示例
下面的一系列命令创建一个包含数字数据类型的表,并对数据执行一些数学运算。
=> CREATE TABLE num1 (id INTEGER, amount NUMERIC(8,2));
向表中插入一些值:
=> INSERT INTO num1 VALUES (1, 123456.78);
查询表:
=> SELECT * FROM num1;
id | amount
------+-----------
1 | 123456.78
(1 row)
下面的例子从表 num1 返回 NUMERIC 列、总数:
=> SELECT amount FROM num1;
amount
-----------
123456.78
(1 row)
下面的语法在总数上加一 (1):
=> SELECT amount+1 AS 'amount' FROM num1;
amount
-----------
123457.78
(1 row)
下面的语法将总数列乘以 2:
=> SELECT amount*2 AS 'amount' FROM num1;
amount
-----------
246913.56
(1 row)
下面的语法为总数列返回负数:
=> SELECT -amount FROM num1;
?column?
------------
-123456.78
(1 row)
下面的语法返回总数实参的绝对值:
=> SELECT ABS(amount) FROM num1;
ABS
-----------
123456.78
(1 row)
下面的语法将 NUMERIC 总数转换为 FLOAT 数据类型:
=> SELECT amount::float FROM num1;
amount
-----------
123456.78
(1 row)